From a1727a8901f6e666363bad71c548ec93760f51ef Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Wed, 7 Jan 2026 00:41:24 -0800 Subject: [PATCH 01/12] [espnow] fix channel validation (#13057) --- esphome/components/espnow/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/esphome/components/espnow/__init__.py b/esphome/components/espnow/__init__.py index cc2c02d4c0..1f5ca1104a 100644 --- a/esphome/components/espnow/__init__.py +++ b/esphome/components/espnow/__init__.py @@ -66,11 +66,17 @@ CONF_WAIT_FOR_SENT = "wait_for_sent" MAX_ESPNOW_PACKET_SIZE = 250 # Maximum size of the payload in bytes +def validate_channel(value): + if value is None: + raise cv.Invalid("channel is required if wifi is not configured") + return wifi.validate_channel(value) + + CONFIG_SCHEMA = cv.All( cv.Schema( { cv.GenerateID(): cv.declare_id(ESPNowComponent), - cv.OnlyWithout(CONF_CHANNEL, CONF_WIFI): wifi.validate_channel, + cv.OnlyWithout(CONF_CHANNEL, CONF_WIFI): validate_channel, cv.Optional(CONF_ENABLE_ON_BOOT, default=True): cv.boolean, cv.Optional(CONF_AUTO_ADD_PEER, default=False): cv.boolean, cv.Optional(CONF_PEERS): cv.ensure_list(cv.mac_address), From dca8def0f2c41420051f1c976f8c0c1b0ac94708 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Sun, 11 Jan 2026 22:16:55 -0500 Subject: [PATCH 02/12] [seeed_mr24hpc1] Add ifdef guards for conditional entity types (#13147) Co-authored-by: Claude Opus 4.5 --- .../seeed_mr24hpc1/seeed_mr24hpc1.cpp | 432 +++++++++++------- 1 file changed, 273 insertions(+), 159 deletions(-) diff --git a/esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp b/esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp index 4c0416d727..08d83f9390 100644 --- a/esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +++ b/esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp @@ -64,15 +64,21 @@ void MR24HPC1Component::dump_config() { void MR24HPC1Component::setup() { this->check_uart_settings(115200); +#ifdef USE_NUMBER if (this->custom_mode_number_ != nullptr) { this->custom_mode_number_->publish_state(0); // Zero out the custom mode } +#endif +#ifdef USE_SENSOR if (this->custom_mode_num_sensor_ != nullptr) { this->custom_mode_num_sensor_->publish_state(0); } +#endif +#ifdef USE_TEXT_SENSOR if (this->custom_mode_end_text_sensor_ != nullptr) { this->custom_mode_end_text_sensor_->publish_state("Not in custom mode"); } +#endif this->set_custom_end_mode(); this->poll_time_base_func_check_ = true; this->check_dev_inf_sign_ = true; @@ -353,6 +359,7 @@ void MR24HPC1Component::r24_split_data_frame_(uint8_t value) { // Parses data frames related to product information void MR24HPC1Component::r24_frame_parse_product_information_(uint8_t *data) { +#ifdef USE_TEXT_SENSOR uint16_t product_len = encode_uint16(data[FRAME_COMMAND_WORD_INDEX + 1], data[FRAME_COMMAND_WORD_INDEX + 2]); if (data[FRAME_COMMAND_WORD_INDEX] == COMMAND_PRODUCT_MODE) { if ((this->product_model_text_sensor_ != nullptr) && (product_len < PRODUCT_BUF_MAX_SIZE)) { @@ -388,109 +395,153 @@ void MR24HPC1Component::r24_frame_parse_product_information_(uint8_t *data) { ESP_LOGD(TAG, "Reply: get firmwareVersion error!"); } } +#endif } // Parsing the underlying open parameters void MR24HPC1Component::r24_frame_parse_open_underlying_information_(uint8_t *data) { - if (data[FRAME_COMMAND_WORD_INDEX] == 0x00) { - if (this->underlying_open_function_switch_ != nullptr) { - this->underlying_open_function_switch_->publish_state( - data[FRAME_DATA_INDEX]); // Underlying Open Parameter Switch Status Updates - } - if (data[FRAME_DATA_INDEX]) { - this->s_output_info_switch_flag_ = OUTPUT_SWITCH_ON; - } else { - this->s_output_info_switch_flag_ = OUTPUT_SWTICH_OFF; - } - } else if (data[FRAME_COMMAND_WORD_INDEX] == 0x01) { - if (this->custom_spatial_static_value_sensor_ != nullptr) { - this->custom_spatial_static_value_sensor_->publish_state(data[FRAME_DATA_INDEX]); - } - if (this->custom_presence_of_detection_sensor_ != nullptr) { - this->custom_presence_of_detection_sensor_->publish_state(data[FRAME_DATA_INDEX + 1] * 0.5f); - } - if (this->custom_spatial_motion_value_sensor_ != nullptr) { - this->custom_spatial_motion_value_sensor_->publish_state(data[FRAME_DATA_INDEX + 2]); - } - if (this->custom_motion_distance_sensor_ != nullptr) { - this->custom_motion_distance_sensor_->publish_state(data[FRAME_DATA_INDEX + 3] * 0.5f); - } - if (this->custom_motion_speed_sensor_ != nullptr) { - this->custom_motion_speed_sensor_->publish_state((data[FRAME_DATA_INDEX + 4] - 10) * 0.5f); - } - } else if ((data[FRAME_COMMAND_WORD_INDEX] == 0x06) || (data[FRAME_COMMAND_WORD_INDEX] == 0x86)) { - // none:0x00 close_to:0x01 far_away:0x02 - if ((this->keep_away_text_sensor_ != nullptr) && (data[FRAME_DATA_INDEX] < 3)) { - this->keep_away_text_sensor_->publish_state(S_KEEP_AWAY_STR[data[FRAME_DATA_INDEX]]); - } - } else if ((this->movement_signs_sensor_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x07) || (data[FRAME_COMMAND_WORD_INDEX] == 0x87))) { - this->movement_signs_sensor_->publish_state(data[FRAME_DATA_INDEX]); - } else if ((this->existence_threshold_number_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x08) || (data[FRAME_COMMAND_WORD_INDEX] == 0x88))) { - this->existence_threshold_number_->publish_state(data[FRAME_DATA_INDEX]); - } else if ((this->motion_threshold_number_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x09) || (data[FRAME_COMMAND_WORD_INDEX] == 0x89))) { - this->motion_threshold_number_->publish_state(data[FRAME_DATA_INDEX]); - } else if ((this->existence_boundary_select_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x0a) || (data[FRAME_COMMAND_WORD_INDEX] == 0x8a))) { - if (this->existence_boundary_select_->has_index(data[FRAME_DATA_INDEX] - 1)) { - this->existence_boundary_select_->publish_state(data[FRAME_DATA_INDEX] - 1); - } - } else if ((this->motion_boundary_select_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x0b) || (data[FRAME_COMMAND_WORD_INDEX] == 0x8b))) { - if (this->motion_boundary_select_->has_index(data[FRAME_DATA_INDEX] - 1)) { - this->motion_boundary_select_->publish_state(data[FRAME_DATA_INDEX] - 1); - } - } else if ((this->motion_trigger_number_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x0c) || (data[FRAME_COMMAND_WORD_INDEX] == 0x8c))) { - uint32_t motion_trigger_time = encode_uint32(data[FRAME_DATA_INDEX], data[FRAME_DATA_INDEX + 1], - data[FRAME_DATA_INDEX + 2], data[FRAME_DATA_INDEX + 3]); - this->motion_trigger_number_->publish_state(motion_trigger_time); - } else if ((this->motion_to_rest_number_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x0d) || (data[FRAME_COMMAND_WORD_INDEX] == 0x8d))) { - uint32_t move_to_rest_time = encode_uint32(data[FRAME_DATA_INDEX], data[FRAME_DATA_INDEX + 1], - data[FRAME_DATA_INDEX + 2], data[FRAME_DATA_INDEX + 3]); - this->motion_to_rest_number_->publish_state(move_to_rest_time); - } else if ((this->custom_unman_time_number_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x0e) || (data[FRAME_COMMAND_WORD_INDEX] == 0x8e))) { - uint32_t enter_unmanned_time = encode_uint32(data[FRAME_DATA_INDEX], data[FRAME_DATA_INDEX + 1], - data[FRAME_DATA_INDEX + 2], data[FRAME_DATA_INDEX + 3]); - float custom_unmanned_time = enter_unmanned_time / 1000.0; - this->custom_unman_time_number_->publish_state(custom_unmanned_time); - } else if (data[FRAME_COMMAND_WORD_INDEX] == 0x80) { - if (data[FRAME_DATA_INDEX]) { - this->s_output_info_switch_flag_ = OUTPUT_SWITCH_ON; - } else { - this->s_output_info_switch_flag_ = OUTPUT_SWTICH_OFF; - } - if (this->underlying_open_function_switch_ != nullptr) { - this->underlying_open_function_switch_->publish_state(data[FRAME_DATA_INDEX]); - } - } else if ((this->custom_spatial_static_value_sensor_ != nullptr) && (data[FRAME_COMMAND_WORD_INDEX] == 0x81)) { - this->custom_spatial_static_value_sensor_->publish_state(data[FRAME_DATA_INDEX]); - } else if ((this->custom_spatial_motion_value_sensor_ != nullptr) && (data[FRAME_COMMAND_WORD_INDEX] == 0x82)) { - this->custom_spatial_motion_value_sensor_->publish_state(data[FRAME_DATA_INDEX]); - } else if ((this->custom_presence_of_detection_sensor_ != nullptr) && (data[FRAME_COMMAND_WORD_INDEX] == 0x83)) { - this->custom_presence_of_detection_sensor_->publish_state( - S_PRESENCE_OF_DETECTION_RANGE_STR[data[FRAME_DATA_INDEX]]); - } else if ((this->custom_motion_distance_sensor_ != nullptr) && (data[FRAME_COMMAND_WORD_INDEX] == 0x84)) { - this->custom_motion_distance_sensor_->publish_state(data[FRAME_DATA_INDEX] * 0.5f); - } else if ((this->custom_motion_speed_sensor_ != nullptr) && (data[FRAME_COMMAND_WORD_INDEX] == 0x85)) { - this->custom_motion_speed_sensor_->publish_state((data[FRAME_DATA_INDEX] - 10) * 0.5f); + switch (data[FRAME_COMMAND_WORD_INDEX]) { + case 0x00: + case 0x80: +#ifdef USE_SWITCH + if (this->underlying_open_function_switch_ != nullptr) { + this->underlying_open_function_switch_->publish_state(data[FRAME_DATA_INDEX]); + } +#endif + this->s_output_info_switch_flag_ = data[FRAME_DATA_INDEX] ? OUTPUT_SWITCH_ON : OUTPUT_SWTICH_OFF; + break; +#ifdef USE_SENSOR + case 0x01: + if (this->custom_spatial_static_value_sensor_ != nullptr) { + this->custom_spatial_static_value_sensor_->publish_state(data[FRAME_DATA_INDEX]); + } + if (this->custom_presence_of_detection_sensor_ != nullptr) { + this->custom_presence_of_detection_sensor_->publish_state(data[FRAME_DATA_INDEX + 1] * 0.5f); + } + if (this->custom_spatial_motion_value_sensor_ != nullptr) { + this->custom_spatial_motion_value_sensor_->publish_state(data[FRAME_DATA_INDEX + 2]); + } + if (this->custom_motion_distance_sensor_ != nullptr) { + this->custom_motion_distance_sensor_->publish_state(data[FRAME_DATA_INDEX + 3] * 0.5f); + } + if (this->custom_motion_speed_sensor_ != nullptr) { + this->custom_motion_speed_sensor_->publish_state((data[FRAME_DATA_INDEX + 4] - 10) * 0.5f); + } + break; + case 0x07: + case 0x87: + if (this->movement_signs_sensor_ != nullptr) { + this->movement_signs_sensor_->publish_state(data[FRAME_DATA_INDEX]); + } + break; + case 0x81: + if (this->custom_spatial_static_value_sensor_ != nullptr) { + this->custom_spatial_static_value_sensor_->publish_state(data[FRAME_DATA_INDEX]); + } + break; + case 0x82: + if (this->custom_spatial_motion_value_sensor_ != nullptr) { + this->custom_spatial_motion_value_sensor_->publish_state(data[FRAME_DATA_INDEX]); + } + break; + case 0x83: + if (this->custom_presence_of_detection_sensor_ != nullptr) { + this->custom_presence_of_detection_sensor_->publish_state( + S_PRESENCE_OF_DETECTION_RANGE_STR[data[FRAME_DATA_INDEX]]); + } + break; + case 0x84: + if (this->custom_motion_distance_sensor_ != nullptr) { + this->custom_motion_distance_sensor_->publish_state(data[FRAME_DATA_INDEX] * 0.5f); + } + break; + case 0x85: + if (this->custom_motion_speed_sensor_ != nullptr) { + this->custom_motion_speed_sensor_->publish_state((data[FRAME_DATA_INDEX] - 10) * 0.5f); + } + break; +#endif +#ifdef USE_TEXT_SENSOR + case 0x06: + case 0x86: + // none:0x00 close_to:0x01 far_away:0x02 + if ((this->keep_away_text_sensor_ != nullptr) && (data[FRAME_DATA_INDEX] < 3)) { + this->keep_away_text_sensor_->publish_state(S_KEEP_AWAY_STR[data[FRAME_DATA_INDEX]]); + } + break; +#endif +#ifdef USE_NUMBER + case 0x08: + case 0x88: + if (this->existence_threshold_number_ != nullptr) { + this->existence_threshold_number_->publish_state(data[FRAME_DATA_INDEX]); + } + break; + case 0x09: + case 0x89: + if (this->motion_threshold_number_ != nullptr) { + this->motion_threshold_number_->publish_state(data[FRAME_DATA_INDEX]); + } + break; + case 0x0c: + case 0x8c: + if (this->motion_trigger_number_ != nullptr) { + uint32_t motion_trigger_time = encode_uint32(data[FRAME_DATA_INDEX], data[FRAME_DATA_INDEX + 1], + data[FRAME_DATA_INDEX + 2], data[FRAME_DATA_INDEX + 3]); + this->motion_trigger_number_->publish_state(motion_trigger_time); + } + break; + case 0x0d: + case 0x8d: + if (this->motion_to_rest_number_ != nullptr) { + uint32_t move_to_rest_time = encode_uint32(data[FRAME_DATA_INDEX], data[FRAME_DATA_INDEX + 1], + data[FRAME_DATA_INDEX + 2], data[FRAME_DATA_INDEX + 3]); + this->motion_to_rest_number_->publish_state(move_to_rest_time); + } + break; + case 0x0e: + case 0x8e: + if (this->custom_unman_time_number_ != nullptr) { + uint32_t enter_unmanned_time = encode_uint32(data[FRAME_DATA_INDEX], data[FRAME_DATA_INDEX + 1], + data[FRAME_DATA_INDEX + 2], data[FRAME_DATA_INDEX + 3]); + this->custom_unman_time_number_->publish_state(enter_unmanned_time / 1000.0f); + } + break; +#endif +#ifdef USE_SELECT + case 0x0a: + case 0x8a: + if (this->existence_boundary_select_ != nullptr) { + if (this->existence_boundary_select_->has_index(data[FRAME_DATA_INDEX] - 1)) { + this->existence_boundary_select_->publish_state(data[FRAME_DATA_INDEX] - 1); + } + } + break; + case 0x0b: + case 0x8b: + if (this->motion_boundary_select_ != nullptr) { + if (this->motion_boundary_select_->has_index(data[FRAME_DATA_INDEX] - 1)) { + this->motion_boundary_select_->publish_state(data[FRAME_DATA_INDEX] - 1); + } + } + break; +#endif } } void MR24HPC1Component::r24_parse_data_frame_(uint8_t *data, uint8_t len) { switch (data[FRAME_CONTROL_WORD_INDEX]) { case 0x01: { - if ((this->heartbeat_state_text_sensor_ != nullptr) && (data[FRAME_COMMAND_WORD_INDEX] == 0x01)) { - this->heartbeat_state_text_sensor_->publish_state("Equipment Normal"); - } else if (data[FRAME_COMMAND_WORD_INDEX] == 0x02) { + if (data[FRAME_COMMAND_WORD_INDEX] == 0x02) { ESP_LOGD(TAG, "Reply: query restart packet"); - } else if (this->heartbeat_state_text_sensor_ != nullptr) { - this->heartbeat_state_text_sensor_->publish_state("Equipment Abnormal"); + break; } +#ifdef USE_TEXT_SENSOR + if (this->heartbeat_state_text_sensor_ != nullptr) { + this->heartbeat_state_text_sensor_->publish_state( + data[FRAME_COMMAND_WORD_INDEX] == 0x01 ? "Equipment Normal" : "Equipment Abnormal"); + } +#endif } break; case 0x02: { this->r24_frame_parse_product_information_(data); @@ -511,86 +562,123 @@ void MR24HPC1Component::r24_parse_data_frame_(uint8_t *data, uint8_t len) { } void MR24HPC1Component::r24_frame_parse_work_status_(uint8_t *data) { - if (data[FRAME_COMMAND_WORD_INDEX] == 0x01) { - ESP_LOGD(TAG, "Reply: get radar init status 0x%02X", data[FRAME_DATA_INDEX]); - } else if (data[FRAME_COMMAND_WORD_INDEX] == 0x07) { - if ((this->scene_mode_select_ != nullptr) && (this->scene_mode_select_->has_index(data[FRAME_DATA_INDEX]))) { - this->scene_mode_select_->publish_state(data[FRAME_DATA_INDEX]); - } else { - ESP_LOGD(TAG, "Select has index offset %d Error", data[FRAME_DATA_INDEX]); - } - } else if ((this->sensitivity_number_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x08) || (data[FRAME_COMMAND_WORD_INDEX] == 0x88))) { - // 1-3 - this->sensitivity_number_->publish_state(data[FRAME_DATA_INDEX]); - } else if (data[FRAME_COMMAND_WORD_INDEX] == 0x09) { - // 1-4 - if (this->custom_mode_num_sensor_ != nullptr) { - this->custom_mode_num_sensor_->publish_state(data[FRAME_DATA_INDEX]); - } - if (this->custom_mode_number_ != nullptr) { - this->custom_mode_number_->publish_state(0); - } - if (this->custom_mode_end_text_sensor_ != nullptr) { - this->custom_mode_end_text_sensor_->publish_state("Setup in progress"); - } - } else if (data[FRAME_COMMAND_WORD_INDEX] == 0x81) { - ESP_LOGD(TAG, "Reply: get radar init status 0x%02X", data[FRAME_DATA_INDEX]); - } else if (data[FRAME_COMMAND_WORD_INDEX] == 0x87) { - if ((this->scene_mode_select_ != nullptr) && (this->scene_mode_select_->has_index(data[FRAME_DATA_INDEX]))) { - this->scene_mode_select_->publish_state(data[FRAME_DATA_INDEX]); - } else { - ESP_LOGD(TAG, "Select has index offset %d Error", data[FRAME_DATA_INDEX]); - } - } else if ((this->custom_mode_end_text_sensor_ != nullptr) && (data[FRAME_COMMAND_WORD_INDEX] == 0x0A)) { - this->custom_mode_end_text_sensor_->publish_state("Set Success!"); - } else if (data[FRAME_COMMAND_WORD_INDEX] == 0x89) { - if (data[FRAME_DATA_INDEX] == 0) { - if (this->custom_mode_end_text_sensor_ != nullptr) { - this->custom_mode_end_text_sensor_->publish_state("Not in custom mode"); + switch (data[FRAME_COMMAND_WORD_INDEX]) { + case 0x01: + case 0x81: + ESP_LOGD(TAG, "Reply: get radar init status 0x%02X", data[FRAME_DATA_INDEX]); + break; + case 0x09: +#ifdef USE_SENSOR + if (this->custom_mode_num_sensor_ != nullptr) { + this->custom_mode_num_sensor_->publish_state(data[FRAME_DATA_INDEX]); } +#endif +#ifdef USE_NUMBER if (this->custom_mode_number_ != nullptr) { this->custom_mode_number_->publish_state(0); } +#endif +#ifdef USE_TEXT_SENSOR + if (this->custom_mode_end_text_sensor_ != nullptr) { + this->custom_mode_end_text_sensor_->publish_state("Setup in progress"); + } +#endif + break; + case 0x89: +#ifdef USE_SENSOR if (this->custom_mode_num_sensor_ != nullptr) { this->custom_mode_num_sensor_->publish_state(data[FRAME_DATA_INDEX]); } - } else { - if (this->custom_mode_num_sensor_ != nullptr) { - this->custom_mode_num_sensor_->publish_state(data[FRAME_DATA_INDEX]); +#endif + if (data[FRAME_DATA_INDEX] == 0) { +#ifdef USE_TEXT_SENSOR + if (this->custom_mode_end_text_sensor_ != nullptr) { + this->custom_mode_end_text_sensor_->publish_state("Not in custom mode"); + } +#endif +#ifdef USE_NUMBER + if (this->custom_mode_number_ != nullptr) { + this->custom_mode_number_->publish_state(0); + } +#endif } - } - } else { - ESP_LOGD(TAG, "[%s] No found COMMAND_WORD(%02X) in Frame", __FUNCTION__, data[FRAME_COMMAND_WORD_INDEX]); + break; +#ifdef USE_SELECT + case 0x07: + case 0x87: + if ((this->scene_mode_select_ != nullptr) && (this->scene_mode_select_->has_index(data[FRAME_DATA_INDEX]))) { + this->scene_mode_select_->publish_state(data[FRAME_DATA_INDEX]); + } else { + ESP_LOGD(TAG, "Select has index offset %d Error", data[FRAME_DATA_INDEX]); + } + break; +#endif +#ifdef USE_NUMBER + case 0x08: + case 0x88: + if (this->sensitivity_number_ != nullptr) { + this->sensitivity_number_->publish_state(data[FRAME_DATA_INDEX]); + } + break; +#endif +#ifdef USE_TEXT_SENSOR + case 0x0A: + if (this->custom_mode_end_text_sensor_ != nullptr) { + this->custom_mode_end_text_sensor_->publish_state("Set Success!"); + } + break; +#endif + default: + ESP_LOGD(TAG, "[%s] No found COMMAND_WORD(%02X) in Frame", __FUNCTION__, data[FRAME_COMMAND_WORD_INDEX]); + break; } } void MR24HPC1Component::r24_frame_parse_human_information_(uint8_t *data) { - if ((this->has_target_binary_sensor_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x01) || (data[FRAME_COMMAND_WORD_INDEX] == 0x81))) { - this->has_target_binary_sensor_->publish_state(S_SOMEONE_EXISTS_STR[data[FRAME_DATA_INDEX]]); - } else if ((this->motion_status_text_sensor_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x02) || (data[FRAME_COMMAND_WORD_INDEX] == 0x82))) { - if (data[FRAME_DATA_INDEX] < 3) { - this->motion_status_text_sensor_->publish_state(S_MOTION_STATUS_STR[data[FRAME_DATA_INDEX]]); - } - } else if ((this->movement_signs_sensor_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x03) || (data[FRAME_COMMAND_WORD_INDEX] == 0x83))) { - this->movement_signs_sensor_->publish_state(data[FRAME_DATA_INDEX]); - } else if ((this->unman_time_select_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x0A) || (data[FRAME_COMMAND_WORD_INDEX] == 0x8A))) { - // none:0x00 1s:0x01 30s:0x02 1min:0x03 2min:0x04 5min:0x05 10min:0x06 30min:0x07 1hour:0x08 - if (data[FRAME_DATA_INDEX] < 9) { - this->unman_time_select_->publish_state(data[FRAME_DATA_INDEX]); - } - } else if ((this->keep_away_text_sensor_ != nullptr) && - ((data[FRAME_COMMAND_WORD_INDEX] == 0x0B) || (data[FRAME_COMMAND_WORD_INDEX] == 0x8B))) { - // none:0x00 close_to:0x01 far_away:0x02 - if (data[FRAME_DATA_INDEX] < 3) { - this->keep_away_text_sensor_->publish_state(S_KEEP_AWAY_STR[data[FRAME_DATA_INDEX]]); - } - } else { - ESP_LOGD(TAG, "[%s] No found COMMAND_WORD(%02X) in Frame", __FUNCTION__, data[FRAME_COMMAND_WORD_INDEX]); + switch (data[FRAME_COMMAND_WORD_INDEX]) { +#ifdef USE_BINARY_SENSOR + case 0x01: + case 0x81: + if (this->has_target_binary_sensor_ != nullptr) { + this->has_target_binary_sensor_->publish_state(S_SOMEONE_EXISTS_STR[data[FRAME_DATA_INDEX]]); + } + break; +#endif +#ifdef USE_SENSOR + case 0x03: + case 0x83: + if (this->movement_signs_sensor_ != nullptr) { + this->movement_signs_sensor_->publish_state(data[FRAME_DATA_INDEX]); + } + break; +#endif +#ifdef USE_TEXT_SENSOR + case 0x02: + case 0x82: + if ((this->motion_status_text_sensor_ != nullptr) && (data[FRAME_DATA_INDEX] < 3)) { + this->motion_status_text_sensor_->publish_state(S_MOTION_STATUS_STR[data[FRAME_DATA_INDEX]]); + } + break; + case 0x0B: + case 0x8B: + // none:0x00 close_to:0x01 far_away:0x02 + if ((this->keep_away_text_sensor_ != nullptr) && (data[FRAME_DATA_INDEX] < 3)) { + this->keep_away_text_sensor_->publish_state(S_KEEP_AWAY_STR[data[FRAME_DATA_INDEX]]); + } + break; +#endif +#ifdef USE_SELECT + case 0x0A: + case 0x8A: + // none:0x00 1s:0x01 30s:0x02 1min:0x03 2min:0x04 5min:0x05 10min:0x06 30min:0x07 1hour:0x08 + if ((this->unman_time_select_ != nullptr) && (data[FRAME_DATA_INDEX] < 9)) { + this->unman_time_select_->publish_state(data[FRAME_DATA_INDEX]); + } + break; +#endif + default: + ESP_LOGD(TAG, "[%s] No found COMMAND_WORD(%02X) in Frame", __FUNCTION__, data[FRAME_COMMAND_WORD_INDEX]); + break; } } @@ -695,12 +783,15 @@ void MR24HPC1Component::set_underlying_open_function(bool enable) { } else { this->send_query_(UNDERLYING_SWITCH_OFF, sizeof(UNDERLYING_SWITCH_OFF)); } +#ifdef USE_TEXT_SENSOR if (this->keep_away_text_sensor_ != nullptr) { this->keep_away_text_sensor_->publish_state(""); } if (this->motion_status_text_sensor_ != nullptr) { this->motion_status_text_sensor_->publish_state(""); } +#endif +#ifdef USE_SENSOR if (this->custom_spatial_static_value_sensor_ != nullptr) { this->custom_spatial_static_value_sensor_->publish_state(NAN); } @@ -716,6 +807,7 @@ void MR24HPC1Component::set_underlying_open_function(bool enable) { if (this->custom_motion_speed_sensor_ != nullptr) { this->custom_motion_speed_sensor_->publish_state(NAN); } +#endif } void MR24HPC1Component::set_scene_mode(uint8_t value) { @@ -723,12 +815,16 @@ void MR24HPC1Component::set_scene_mode(uint8_t value) { uint8_t send_data[10] = {0x53, 0x59, 0x05, 0x07, 0x00, 0x01, value, 0x00, 0x54, 0x43}; send_data[7] = get_frame_crc_sum(send_data, send_data_len); this->send_query_(send_data, send_data_len); +#ifdef USE_NUMBER if (this->custom_mode_number_ != nullptr) { this->custom_mode_number_->publish_state(0); } +#endif +#ifdef USE_SENSOR if (this->custom_mode_num_sensor_ != nullptr) { this->custom_mode_num_sensor_->publish_state(0); } +#endif this->get_scene_mode(); this->get_sensitivity(); this->get_custom_mode(); @@ -768,9 +864,11 @@ void MR24HPC1Component::set_unman_time(uint8_t value) { void MR24HPC1Component::set_custom_mode(uint8_t mode) { if (mode == 0) { this->set_custom_end_mode(); // Equivalent to end setting +#ifdef USE_NUMBER if (this->custom_mode_number_ != nullptr) { this->custom_mode_number_->publish_state(0); } +#endif return; } uint8_t send_data_len = 10; @@ -793,9 +891,11 @@ void MR24HPC1Component::set_custom_end_mode() { uint8_t send_data_len = 10; uint8_t send_data[10] = {0x53, 0x59, 0x05, 0x0a, 0x00, 0x01, 0x0F, 0xCB, 0x54, 0x43}; this->send_query_(send_data, send_data_len); +#ifdef USE_NUMBER if (this->custom_mode_number_ != nullptr) { this->custom_mode_number_->publish_state(0); // Clear setpoints } +#endif this->get_existence_boundary(); this->get_motion_boundary(); this->get_existence_threshold(); @@ -809,8 +909,10 @@ void MR24HPC1Component::set_custom_end_mode() { } void MR24HPC1Component::set_existence_boundary(uint8_t value) { +#ifdef USE_SENSOR if ((this->custom_mode_num_sensor_ != nullptr) && (this->custom_mode_num_sensor_->state == 0)) return; // You'll have to check that you're in custom mode to set it up +#endif uint8_t send_data_len = 10; uint8_t send_data[10] = {0x53, 0x59, 0x08, 0x0A, 0x00, 0x01, (uint8_t) (value + 1), 0x00, 0x54, 0x43}; send_data[7] = get_frame_crc_sum(send_data, send_data_len); @@ -819,8 +921,10 @@ void MR24HPC1Component::set_existence_boundary(uint8_t value) { } void MR24HPC1Component::set_motion_boundary(uint8_t value) { +#ifdef USE_SENSOR if ((this->custom_mode_num_sensor_ != nullptr) && (this->custom_mode_num_sensor_->state == 0)) return; // You'll have to check that you're in custom mode to set it up +#endif uint8_t send_data_len = 10; uint8_t send_data[10] = {0x53, 0x59, 0x08, 0x0B, 0x00, 0x01, (uint8_t) (value + 1), 0x00, 0x54, 0x43}; send_data[7] = get_frame_crc_sum(send_data, send_data_len); @@ -829,8 +933,10 @@ void MR24HPC1Component::set_motion_boundary(uint8_t value) { } void MR24HPC1Component::set_existence_threshold(uint8_t value) { +#ifdef USE_SENSOR if ((this->custom_mode_num_sensor_ != nullptr) && (this->custom_mode_num_sensor_->state == 0)) return; // You'll have to check that you're in custom mode to set it up +#endif uint8_t send_data_len = 10; uint8_t send_data[10] = {0x53, 0x59, 0x08, 0x08, 0x00, 0x01, value, 0x00, 0x54, 0x43}; send_data[7] = get_frame_crc_sum(send_data, send_data_len); @@ -839,8 +945,10 @@ void MR24HPC1Component::set_existence_threshold(uint8_t value) { } void MR24HPC1Component::set_motion_threshold(uint8_t value) { +#ifdef USE_SENSOR if ((this->custom_mode_num_sensor_ != nullptr) && (this->custom_mode_num_sensor_->state == 0)) return; // You'll have to check that you're in custom mode to set it up +#endif uint8_t send_data_len = 10; uint8_t send_data[10] = {0x53, 0x59, 0x08, 0x09, 0x00, 0x01, value, 0x00, 0x54, 0x43}; send_data[7] = get_frame_crc_sum(send_data, send_data_len); @@ -849,8 +957,10 @@ void MR24HPC1Component::set_motion_threshold(uint8_t value) { } void MR24HPC1Component::set_motion_trigger_time(uint8_t value) { +#ifdef USE_SENSOR if ((this->custom_mode_num_sensor_ != nullptr) && (this->custom_mode_num_sensor_->state == 0)) return; // You'll have to check that you're in custom mode to set it up +#endif uint8_t send_data_len = 13; uint8_t send_data[13] = {0x53, 0x59, 0x08, 0x0C, 0x00, 0x04, 0x00, 0x00, 0x00, value, 0x00, 0x54, 0x43}; send_data[10] = get_frame_crc_sum(send_data, send_data_len); @@ -859,8 +969,10 @@ void MR24HPC1Component::set_motion_trigger_time(uint8_t value) { } void MR24HPC1Component::set_motion_to_rest_time(uint16_t value) { +#ifdef USE_SENSOR if ((this->custom_mode_num_sensor_ != nullptr) && (this->custom_mode_num_sensor_->state == 0)) return; // You'll have to check that you're in custom mode to set it up +#endif uint8_t h8_num = (value >> 8) & 0xff; uint8_t l8_num = value & 0xff; uint8_t send_data_len = 13; @@ -871,8 +983,10 @@ void MR24HPC1Component::set_motion_to_rest_time(uint16_t value) { } void MR24HPC1Component::set_custom_unman_time(uint16_t value) { +#ifdef USE_SENSOR if ((this->custom_mode_num_sensor_ != nullptr) && (this->custom_mode_num_sensor_->state == 0)) return; // You'll have to check that you're in custom mode to set it up +#endif uint32_t value_ms = value * 1000; uint8_t h24_num = (value_ms >> 24) & 0xff; uint8_t h16_num = (value_ms >> 16) & 0xff; From dede47477b50e8fef8c85e196e0c87eaf828bbef Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Mon, 12 Jan 2026 14:09:54 -0500 Subject: [PATCH 03/12] [ltr_als_ps] Remove incorrect device_class from count sensors (#13167) Co-authored-by: Claude Opus 4.5 --- esphome/components/ltr_als_ps/sensor.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/esphome/components/ltr_als_ps/sensor.py b/esphome/components/ltr_als_ps/sensor.py index 27263d0bff..0dbcff1bfb 100644 --- a/esphome/components/ltr_als_ps/sensor.py +++ b/esphome/components/ltr_als_ps/sensor.py @@ -16,7 +16,6 @@ from esphome.const import ( CONF_REPEAT, CONF_TRIGGER_ID, CONF_TYPE, - DEVICE_CLASS_DISTANCE, DEVICE_CLASS_ILLUMINANCE, ICON_BRIGHTNESS_5, ICON_BRIGHTNESS_6, @@ -169,7 +168,6 @@ CONFIG_SCHEMA = cv.All( unit_of_measurement=UNIT_COUNTS, icon=ICON_BRIGHTNESS_5, accuracy_decimals=0, - device_class=DEVICE_CLASS_ILLUMINANCE, state_class=STATE_CLASS_MEASUREMENT, ), key=CONF_NAME, @@ -179,7 +177,6 @@ CONFIG_SCHEMA = cv.All( unit_of_measurement=UNIT_COUNTS, icon=ICON_BRIGHTNESS_7, accuracy_decimals=0, - device_class=DEVICE_CLASS_ILLUMINANCE, state_class=STATE_CLASS_MEASUREMENT, ), key=CONF_NAME, @@ -189,7 +186,6 @@ CONFIG_SCHEMA = cv.All( unit_of_measurement=UNIT_COUNTS, icon=ICON_PROXIMITY, accuracy_decimals=0, - device_class=DEVICE_CLASS_DISTANCE, state_class=STATE_CLASS_MEASUREMENT, ), key=CONF_NAME, @@ -198,7 +194,6 @@ CONFIG_SCHEMA = cv.All( sensor.sensor_schema( icon=ICON_GAIN, accuracy_decimals=0, - device_class=DEVICE_CLASS_ILLUMINANCE, state_class=STATE_CLASS_MEASUREMENT, ), key=CONF_NAME, From 3911991de2254fe77c2b1381f67612a14c262f59 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Mon, 12 Jan 2026 14:10:15 -0500 Subject: [PATCH 04/12] [packet_transport] Fix packet size check to account for round4 padding (#13165) Co-authored-by: Claude Opus 4.5 --- esphome/components/packet_transport/packet_transport.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/packet_transport/packet_transport.cpp b/esphome/components/packet_transport/packet_transport.cpp index da7f5f8bff..8ae2f759d0 100644 --- a/esphome/components/packet_transport/packet_transport.cpp +++ b/esphome/components/packet_transport/packet_transport.cpp @@ -269,7 +269,7 @@ void PacketTransport::flush_() { void PacketTransport::add_binary_data_(uint8_t key, const char *id, bool data) { auto len = 1 + 1 + 1 + strlen(id); - if (len + this->header_.size() + this->data_.size() > this->get_max_packet_size()) { + if (round4(this->header_.size()) + round4(this->data_.size() + len) > this->get_max_packet_size()) { this->flush_(); this->init_data_(); } @@ -284,7 +284,7 @@ void PacketTransport::add_data_(uint8_t key, const char *id, float data) { void PacketTransport::add_data_(uint8_t key, const char *id, uint32_t data) { auto len = 4 + 1 + 1 + strlen(id); - if (len + this->header_.size() + this->data_.size() > this->get_max_packet_size()) { + if (round4(this->header_.size()) + round4(this->data_.size() + len) > this->get_max_packet_size()) { this->flush_(); this->init_data_(); } From 9504e92458176808313087c7a0f85375fc3d33d5 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Mon, 12 Jan 2026 18:06:41 -0500 Subject: [PATCH 05/12] [remote_transmitter] Fix ESP8266 timing by using busy loop (#13172) Co-authored-by: Claude --- .../components/remote_transmitter/remote_transmitter.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/esphome/components/remote_transmitter/remote_transmitter.cpp b/esphome/components/remote_transmitter/remote_transmitter.cpp index 576143bcbc..f20789fb9f 100644 --- a/esphome/components/remote_transmitter/remote_transmitter.cpp +++ b/esphome/components/remote_transmitter/remote_transmitter.cpp @@ -40,13 +40,10 @@ void RemoteTransmitterComponent::await_target_time_() { if (this->target_time_ == 0) { this->target_time_ = current_time; } else if ((int32_t) (this->target_time_ - current_time) > 0) { -#if defined(USE_LIBRETINY) || defined(USE_RP2040) - // busy loop is required for libretiny and rp2040 as interrupts are disabled + // busy loop is required as interrupts are disabled and delayMicroseconds() + // may not work correctly in interrupt-disabled contexts on all platforms while ((int32_t) (this->target_time_ - micros()) > 0) ; -#else - delayMicroseconds(this->target_time_ - current_time); -#endif } } From d6507ce329f0fef53b76fbfcb0bcb3554a9627cc Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 12 Jan 2026 20:55:40 -1000 Subject: [PATCH 06/12] [esphome] Fix OTA backend abort not being called on error (#13182) --- esphome/components/esphome/ota/ota_esphome.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/esphome/components/esphome/ota/ota_esphome.cpp b/esphome/components/esphome/ota/ota_esphome.cpp index 6cfd543553..175bc40f81 100644 --- a/esphome/components/esphome/ota/ota_esphome.cpp +++ b/esphome/components/esphome/ota/ota_esphome.cpp @@ -395,12 +395,14 @@ void ESPHomeOTAComponent::handle_data_() { error: this->write_byte_(static_cast(error_code)); - this->cleanup_connection_(); + // Abort backend before cleanup - cleanup_connection_() destroys the backend if (this->backend_ != nullptr && update_started) { this->backend_->abort(); } + this->cleanup_connection_(); + this->status_momentary_error("err", 5000); #ifdef USE_OTA_STATE_CALLBACK this->state_callback_.call(ota::OTA_ERROR, 0.0f, static_cast(error_code)); From f4c17e15ea4490c644361ed4137e892a6bbaa664 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Tue, 13 Jan 2026 11:01:21 -0500 Subject: [PATCH 07/12] Bump version to 2025.12.6 --- Doxyfile | 2 +- esphome/const.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doxyfile b/Doxyfile index 079606c501..a23e21dd0d 100644 --- a/Doxyfile +++ b/Doxyfile @@ -48,7 +48,7 @@ PROJECT_NAME = ESPHome # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 2025.12.5 +PROJECT_NUMBER = 2025.12.6 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/esphome/const.py b/esphome/const.py index d1a7104ca4..6771b9f265 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -4,7 +4,7 @@ from enum import Enum from esphome.enum import StrEnum -__version__ = "2025.12.5" +__version__ = "2025.12.6" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 7abb374f2a701f2d6a2aa0a7b7fe0fc78949784f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 13 Jan 2026 08:04:33 -1000 Subject: [PATCH 08/12] [improv_serial] Use stack buffers for webserver URL formatting (#13175) --- .../components/improv_serial/improv_serial_component.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/esphome/components/improv_serial/improv_serial_component.cpp b/esphome/components/improv_serial/improv_serial_component.cpp index 17d630fe83..b4d9943955 100644 --- a/esphome/components/improv_serial/improv_serial_component.cpp +++ b/esphome/components/improv_serial/improv_serial_component.cpp @@ -193,8 +193,12 @@ std::vector ImprovSerialComponent::build_rpc_settings_response_(improv: #ifdef USE_WEBSERVER for (auto &ip : wifi::global_wifi_component->wifi_sta_ip_addresses()) { if (ip.is_ip4()) { - std::string webserver_url = "http://" + ip.str() + ":" + to_string(USE_WEBSERVER_PORT); - urls.push_back(webserver_url); + char ip_buf[network::IP_ADDRESS_BUFFER_SIZE]; + ip.str_to(ip_buf); + // "http://" (7) + IP (40) + ":" (1) + port (5) + null (1) = 54 + char webserver_url[7 + network::IP_ADDRESS_BUFFER_SIZE + 1 + 5 + 1]; + snprintf(webserver_url, sizeof(webserver_url), "http://%s:%u", ip_buf, USE_WEBSERVER_PORT); + urls.emplace_back(webserver_url); break; } } From 7fed9144a675c76437d45aa7d24cc901bc31036b Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 13 Jan 2026 08:04:48 -1000 Subject: [PATCH 09/12] [api] Use stack buffer for VERY_VERBOSE proto message dumps (#13176) --- esphome/components/api/api_connection.cpp | 3 +- esphome/components/api/api_pb2.h | 296 ++++++------ esphome/components/api/api_pb2_dump.cpp | 505 ++++++++++++++------- esphome/components/api/api_pb2_service.cpp | 124 ++--- esphome/components/api/api_pb2_service.h | 6 +- esphome/components/api/proto.cpp | 8 - esphome/components/api/proto.h | 60 ++- script/api_protobuf/api_protobuf.py | 80 ++-- 8 files changed, 661 insertions(+), 421 deletions(-) diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index 65f8c1a8cc..ea18d06511 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -305,7 +305,8 @@ uint16_t APIConnection::encode_message_to_buffer(ProtoMessage &msg, uint8_t mess #ifdef HAS_PROTO_MESSAGE_DUMP // If in log-only mode, just log and return if (conn->flags_.log_only_mode) { - conn->log_send_message_(msg.message_name(), msg.dump()); + DumpBuffer dump_buf; + conn->log_send_message_(msg.message_name(), msg.dump_to(dump_buf)); return 1; // Return non-zero to indicate "success" for logging } #endif diff --git a/esphome/components/api/api_pb2.h b/esphome/components/api/api_pb2.h index 0ab38b8b85..cf6c65f285 100644 --- a/esphome/components/api/api_pb2.h +++ b/esphome/components/api/api_pb2.h @@ -362,7 +362,7 @@ class HelloRequest final : public ProtoDecodableMessage { uint32_t api_version_major{0}; uint32_t api_version_minor{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -383,7 +383,7 @@ class HelloResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -396,7 +396,7 @@ class DisconnectRequest final : public ProtoMessage { const char *message_name() const override { return "disconnect_request"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -409,7 +409,7 @@ class DisconnectResponse final : public ProtoMessage { const char *message_name() const override { return "disconnect_response"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -422,7 +422,7 @@ class PingRequest final : public ProtoMessage { const char *message_name() const override { return "ping_request"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -435,7 +435,7 @@ class PingResponse final : public ProtoMessage { const char *message_name() const override { return "ping_response"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -448,7 +448,7 @@ class DeviceInfoRequest final : public ProtoMessage { const char *message_name() const override { return "device_info_request"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -461,7 +461,7 @@ class AreaInfo final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -476,7 +476,7 @@ class DeviceInfo final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -541,7 +541,7 @@ class DeviceInfoResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -554,7 +554,7 @@ class ListEntitiesRequest final : public ProtoMessage { const char *message_name() const override { return "list_entities_request"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -567,7 +567,7 @@ class ListEntitiesDoneResponse final : public ProtoMessage { const char *message_name() const override { return "list_entities_done_response"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -580,7 +580,7 @@ class SubscribeStatesRequest final : public ProtoMessage { const char *message_name() const override { return "subscribe_states_request"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -598,7 +598,7 @@ class ListEntitiesBinarySensorResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -615,7 +615,7 @@ class BinarySensorStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -637,7 +637,7 @@ class ListEntitiesCoverResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -655,7 +655,7 @@ class CoverStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -673,7 +673,7 @@ class CoverCommandRequest final : public CommandProtoMessage { float tilt{0.0f}; bool stop{false}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -697,7 +697,7 @@ class ListEntitiesFanResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -717,7 +717,7 @@ class FanStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -740,7 +740,7 @@ class FanCommandRequest final : public CommandProtoMessage { bool has_preset_mode{false}; StringRef preset_mode{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -764,7 +764,7 @@ class ListEntitiesLightResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -791,7 +791,7 @@ class LightStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -830,7 +830,7 @@ class LightCommandRequest final : public CommandProtoMessage { bool has_effect{false}; StringRef effect{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -855,7 +855,7 @@ class ListEntitiesSensorResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -872,7 +872,7 @@ class SensorStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -891,7 +891,7 @@ class ListEntitiesSwitchResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -907,7 +907,7 @@ class SwitchStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -921,7 +921,7 @@ class SwitchCommandRequest final : public CommandProtoMessage { #endif bool state{false}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -941,7 +941,7 @@ class ListEntitiesTextSensorResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -958,7 +958,7 @@ class TextSensorStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -974,7 +974,7 @@ class SubscribeLogsRequest final : public ProtoDecodableMessage { enums::LogLevel level{}; bool dump_config{false}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -997,7 +997,7 @@ class SubscribeLogsResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1013,7 +1013,7 @@ class NoiseEncryptionSetKeyRequest final : public ProtoDecodableMessage { const uint8_t *key{nullptr}; uint16_t key_len{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1030,7 +1030,7 @@ class NoiseEncryptionSetKeyResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1045,7 +1045,7 @@ class SubscribeHomeassistantServicesRequest final : public ProtoMessage { const char *message_name() const override { return "subscribe_homeassistant_services_request"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1057,7 +1057,7 @@ class HomeassistantServiceMap final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1086,7 +1086,7 @@ class HomeassistantActionRequest final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1108,7 +1108,7 @@ class HomeassistantActionResponse final : public ProtoDecodableMessage { uint16_t response_data_len{0}; #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1125,7 +1125,7 @@ class SubscribeHomeAssistantStatesRequest final : public ProtoMessage { const char *message_name() const override { return "subscribe_home_assistant_states_request"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1143,7 +1143,7 @@ class SubscribeHomeAssistantStateResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1159,7 +1159,7 @@ class HomeAssistantStateResponse final : public ProtoDecodableMessage { StringRef state{}; StringRef attribute{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1174,7 +1174,7 @@ class GetTimeRequest final : public ProtoMessage { const char *message_name() const override { return "get_time_request"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1189,7 +1189,7 @@ class GetTimeResponse final : public ProtoDecodableMessage { uint32_t epoch_seconds{0}; StringRef timezone{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1204,7 +1204,7 @@ class ListEntitiesServicesArgument final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1223,7 +1223,7 @@ class ListEntitiesServicesResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1241,7 +1241,7 @@ class ExecuteServiceArgument final : public ProtoDecodableMessage { FixedVector string_array{}; void decode(const uint8_t *buffer, size_t length) override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1266,7 +1266,7 @@ class ExecuteServiceRequest final : public ProtoDecodableMessage { #endif void decode(const uint8_t *buffer, size_t length) override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1293,7 +1293,7 @@ class ExecuteServiceResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1310,7 +1310,7 @@ class ListEntitiesCameraResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1332,7 +1332,7 @@ class CameraImageResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1347,7 +1347,7 @@ class CameraImageRequest final : public ProtoDecodableMessage { bool single{false}; bool stream{false}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1383,7 +1383,7 @@ class ListEntitiesClimateResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1411,7 +1411,7 @@ class ClimateStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1444,7 +1444,7 @@ class ClimateCommandRequest final : public CommandProtoMessage { bool has_target_humidity{false}; float target_humidity{0.0f}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1469,7 +1469,7 @@ class ListEntitiesWaterHeaterResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1490,7 +1490,7 @@ class WaterHeaterStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1509,7 +1509,7 @@ class WaterHeaterCommandRequest final : public CommandProtoMessage { float target_temperature_low{0.0f}; float target_temperature_high{0.0f}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1534,7 +1534,7 @@ class ListEntitiesNumberResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1551,7 +1551,7 @@ class NumberStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1565,7 +1565,7 @@ class NumberCommandRequest final : public CommandProtoMessage { #endif float state{0.0f}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1585,7 +1585,7 @@ class ListEntitiesSelectResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1602,7 +1602,7 @@ class SelectStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1616,7 +1616,7 @@ class SelectCommandRequest final : public CommandProtoMessage { #endif StringRef state{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1639,7 +1639,7 @@ class ListEntitiesSirenResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1655,7 +1655,7 @@ class SirenStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1676,7 +1676,7 @@ class SirenCommandRequest final : public CommandProtoMessage { bool has_volume{false}; float volume{0.0f}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1700,7 +1700,7 @@ class ListEntitiesLockResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1716,7 +1716,7 @@ class LockStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1732,7 +1732,7 @@ class LockCommandRequest final : public CommandProtoMessage { bool has_code{false}; StringRef code{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1753,7 +1753,7 @@ class ListEntitiesButtonResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1766,7 +1766,7 @@ class ButtonCommandRequest final : public CommandProtoMessage { const char *message_name() const override { return "button_command_request"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1785,7 +1785,7 @@ class MediaPlayerSupportedFormat final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1803,7 +1803,7 @@ class ListEntitiesMediaPlayerResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1821,7 +1821,7 @@ class MediaPlayerStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1842,7 +1842,7 @@ class MediaPlayerCommandRequest final : public CommandProtoMessage { bool has_announcement{false}; bool announcement{false}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1861,7 +1861,7 @@ class SubscribeBluetoothLEAdvertisementsRequest final : public ProtoDecodableMes #endif uint32_t flags{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1877,7 +1877,7 @@ class BluetoothLERawAdvertisement final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1894,7 +1894,7 @@ class BluetoothLERawAdvertisementsResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1911,7 +1911,7 @@ class BluetoothDeviceRequest final : public ProtoDecodableMessage { bool has_address_type{false}; uint32_t address_type{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1931,7 +1931,7 @@ class BluetoothDeviceConnectionResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1945,7 +1945,7 @@ class BluetoothGATTGetServicesRequest final : public ProtoDecodableMessage { #endif uint64_t address{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1959,7 +1959,7 @@ class BluetoothGATTDescriptor final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1974,7 +1974,7 @@ class BluetoothGATTCharacteristic final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -1988,7 +1988,7 @@ class BluetoothGATTService final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2005,7 +2005,7 @@ class BluetoothGATTGetServicesResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2021,7 +2021,7 @@ class BluetoothGATTGetServicesDoneResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2036,7 +2036,7 @@ class BluetoothGATTReadRequest final : public ProtoDecodableMessage { uint64_t address{0}; uint32_t handle{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2060,7 +2060,7 @@ class BluetoothGATTReadResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2078,7 +2078,7 @@ class BluetoothGATTWriteRequest final : public ProtoDecodableMessage { const uint8_t *data{nullptr}; uint16_t data_len{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2095,7 +2095,7 @@ class BluetoothGATTReadDescriptorRequest final : public ProtoDecodableMessage { uint64_t address{0}; uint32_t handle{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2113,7 +2113,7 @@ class BluetoothGATTWriteDescriptorRequest final : public ProtoDecodableMessage { const uint8_t *data{nullptr}; uint16_t data_len{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2131,7 +2131,7 @@ class BluetoothGATTNotifyRequest final : public ProtoDecodableMessage { uint32_t handle{0}; bool enable{false}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2155,7 +2155,7 @@ class BluetoothGATTNotifyDataResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2168,7 +2168,7 @@ class SubscribeBluetoothConnectionsFreeRequest final : public ProtoMessage { const char *message_name() const override { return "subscribe_bluetooth_connections_free_request"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2186,7 +2186,7 @@ class BluetoothConnectionsFreeResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2204,7 +2204,7 @@ class BluetoothGATTErrorResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2221,7 +2221,7 @@ class BluetoothGATTWriteResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2238,7 +2238,7 @@ class BluetoothGATTNotifyResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2256,7 +2256,7 @@ class BluetoothDevicePairingResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2274,7 +2274,7 @@ class BluetoothDeviceUnpairingResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2287,7 +2287,7 @@ class UnsubscribeBluetoothLEAdvertisementsRequest final : public ProtoMessage { const char *message_name() const override { return "unsubscribe_bluetooth_le_advertisements_request"; } #endif #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2305,7 +2305,7 @@ class BluetoothDeviceClearCacheResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2323,7 +2323,7 @@ class BluetoothScannerStateResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2337,7 +2337,7 @@ class BluetoothScannerSetModeRequest final : public ProtoDecodableMessage { #endif enums::BluetoothScannerMode mode{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2355,7 +2355,7 @@ class SubscribeVoiceAssistantRequest final : public ProtoDecodableMessage { bool subscribe{false}; uint32_t flags{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2369,7 +2369,7 @@ class VoiceAssistantAudioSettings final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2389,7 +2389,7 @@ class VoiceAssistantRequest final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2404,7 +2404,7 @@ class VoiceAssistantResponse final : public ProtoDecodableMessage { uint32_t port{0}; bool error{false}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2415,7 +2415,7 @@ class VoiceAssistantEventData final : public ProtoDecodableMessage { StringRef name{}; StringRef value{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2431,7 +2431,7 @@ class VoiceAssistantEventResponse final : public ProtoDecodableMessage { enums::VoiceAssistantEvent event_type{}; std::vector data{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2451,7 +2451,7 @@ class VoiceAssistantAudio final : public ProtoDecodableMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2472,7 +2472,7 @@ class VoiceAssistantTimerEventResponse final : public ProtoDecodableMessage { uint32_t seconds_left{0}; bool is_active{false}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2491,7 +2491,7 @@ class VoiceAssistantAnnounceRequest final : public ProtoDecodableMessage { StringRef preannounce_media_id{}; bool start_conversation{false}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2509,7 +2509,7 @@ class VoiceAssistantAnnounceFinished final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2522,7 +2522,7 @@ class VoiceAssistantWakeWord final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2537,7 +2537,7 @@ class VoiceAssistantExternalWakeWord final : public ProtoDecodableMessage { StringRef model_hash{}; StringRef url{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2553,7 +2553,7 @@ class VoiceAssistantConfigurationRequest final : public ProtoDecodableMessage { #endif std::vector external_wake_words{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2572,7 +2572,7 @@ class VoiceAssistantConfigurationResponse final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2586,7 +2586,7 @@ class VoiceAssistantSetConfiguration final : public ProtoDecodableMessage { #endif std::vector active_wake_words{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2607,7 +2607,7 @@ class ListEntitiesAlarmControlPanelResponse final : public InfoResponseProtoMess void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2623,7 +2623,7 @@ class AlarmControlPanelStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2638,7 +2638,7 @@ class AlarmControlPanelCommandRequest final : public CommandProtoMessage { enums::AlarmControlPanelStateCommand command{}; StringRef code{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2662,7 +2662,7 @@ class ListEntitiesTextResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2679,7 +2679,7 @@ class TextStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2693,7 +2693,7 @@ class TextCommandRequest final : public CommandProtoMessage { #endif StringRef state{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2713,7 +2713,7 @@ class ListEntitiesDateResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2732,7 +2732,7 @@ class DateStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2748,7 +2748,7 @@ class DateCommandRequest final : public CommandProtoMessage { uint32_t month{0}; uint32_t day{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2767,7 +2767,7 @@ class ListEntitiesTimeResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2786,7 +2786,7 @@ class TimeStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2802,7 +2802,7 @@ class TimeCommandRequest final : public CommandProtoMessage { uint32_t minute{0}; uint32_t second{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2823,7 +2823,7 @@ class ListEntitiesEventResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2839,7 +2839,7 @@ class EventResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2860,7 +2860,7 @@ class ListEntitiesValveResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2877,7 +2877,7 @@ class ValveStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2893,7 +2893,7 @@ class ValveCommandRequest final : public CommandProtoMessage { float position{0.0f}; bool stop{false}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2912,7 +2912,7 @@ class ListEntitiesDateTimeResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2929,7 +2929,7 @@ class DateTimeStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2943,7 +2943,7 @@ class DateTimeCommandRequest final : public CommandProtoMessage { #endif uint32_t epoch_seconds{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2963,7 +2963,7 @@ class ListEntitiesUpdateResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -2987,7 +2987,7 @@ class UpdateStateResponse final : public StateResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -3001,7 +3001,7 @@ class UpdateCommandRequest final : public CommandProtoMessage { #endif enums::UpdateCommand command{}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -3022,7 +3022,7 @@ class ZWaveProxyFrame final : public ProtoDecodableMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -3041,7 +3041,7 @@ class ZWaveProxyRequest final : public ProtoDecodableMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -3061,7 +3061,7 @@ class ListEntitiesInfraredResponse final : public InfoResponseProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -3085,7 +3085,7 @@ class InfraredRFTransmitRawTimingsRequest final : public ProtoDecodableMessage { uint16_t timings_length_{0}; uint16_t timings_count_{0}; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: @@ -3108,7 +3108,7 @@ class InfraredRFReceiveEvent final : public ProtoMessage { void encode(ProtoWriteBuffer buffer) const override; void calculate_size(ProtoSize &size) const override; #ifdef HAS_PROTO_MESSAGE_DUMP - void dump_to(std::string &out) const override; + const char *dump_to(DumpBuffer &out) const override; #endif protected: diff --git a/esphome/components/api/api_pb2_dump.cpp b/esphome/components/api/api_pb2_dump.cpp index 9550ecbcdd..29121f05e0 100644 --- a/esphome/components/api/api_pb2_dump.cpp +++ b/esphome/components/api/api_pb2_dump.cpp @@ -10,7 +10,7 @@ namespace esphome::api { // Helper function to append a quoted string, handling empty StringRef -static inline void append_quoted_string(std::string &out, const StringRef &ref) { +static inline void append_quoted_string(DumpBuffer &out, const StringRef &ref) { out.append("'"); if (!ref.empty()) { out.append(ref.c_str()); @@ -19,82 +19,88 @@ static inline void append_quoted_string(std::string &out, const StringRef &ref) } // Common helpers for dump_field functions -static inline void append_field_prefix(std::string &out, const char *field_name, int indent) { +static inline void append_field_prefix(DumpBuffer &out, const char *field_name, int indent) { out.append(indent, ' ').append(field_name).append(": "); } -static inline void append_with_newline(std::string &out, const char *str) { +static inline void append_with_newline(DumpBuffer &out, const char *str) { out.append(str); out.append("\n"); } +static inline void append_uint(DumpBuffer &out, uint32_t value) { + char buf[16]; + snprintf(buf, sizeof(buf), "%" PRIu32, value); + out.append(buf); +} + // RAII helper for message dump formatting class MessageDumpHelper { public: - MessageDumpHelper(std::string &out, const char *message_name) : out_(out) { + MessageDumpHelper(DumpBuffer &out, const char *message_name) : out_(out) { out_.append(message_name); out_.append(" {\n"); } ~MessageDumpHelper() { out_.append(" }"); } private: - std::string &out_; + DumpBuffer &out_; }; // Helper functions to reduce code duplication in dump methods -static void dump_field(std::string &out, const char *field_name, int32_t value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, int32_t value, int indent = 2) { char buffer[64]; append_field_prefix(out, field_name, indent); snprintf(buffer, 64, "%" PRId32, value); append_with_newline(out, buffer); } -static void dump_field(std::string &out, const char *field_name, uint32_t value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, uint32_t value, int indent = 2) { char buffer[64]; append_field_prefix(out, field_name, indent); snprintf(buffer, 64, "%" PRIu32, value); append_with_newline(out, buffer); } -static void dump_field(std::string &out, const char *field_name, float value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, float value, int indent = 2) { char buffer[64]; append_field_prefix(out, field_name, indent); snprintf(buffer, 64, "%g", value); append_with_newline(out, buffer); } -static void dump_field(std::string &out, const char *field_name, uint64_t value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, uint64_t value, int indent = 2) { char buffer[64]; append_field_prefix(out, field_name, indent); snprintf(buffer, 64, "%" PRIu64, value); append_with_newline(out, buffer); } -static void dump_field(std::string &out, const char *field_name, bool value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, bool value, int indent = 2) { append_field_prefix(out, field_name, indent); out.append(YESNO(value)); out.append("\n"); } -static void dump_field(std::string &out, const char *field_name, const std::string &value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, const std::string &value, int indent = 2) { append_field_prefix(out, field_name, indent); - out.append("'").append(value).append("'"); + out.append("'").append(value.c_str()).append("'"); out.append("\n"); } -static void dump_field(std::string &out, const char *field_name, StringRef value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, StringRef value, int indent = 2) { append_field_prefix(out, field_name, indent); append_quoted_string(out, value); out.append("\n"); } -static void dump_field(std::string &out, const char *field_name, const char *value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, const char *value, int indent = 2) { append_field_prefix(out, field_name, indent); out.append("'").append(value).append("'"); out.append("\n"); } -template static void dump_field(std::string &out, const char *field_name, T value, int indent = 2) { +template static void dump_field(DumpBuffer &out, const char *field_name, T value, int indent = 2) { append_field_prefix(out, field_name, indent); out.append(proto_enum_to_string(value)); out.append("\n"); @@ -102,8 +108,7 @@ template static void dump_field(std::string &out, const char *field_ // Helper for bytes fields - uses stack buffer to avoid heap allocation // Buffer sized for 160 bytes of data (480 chars with separators) to fit typical log buffer -static void dump_bytes_field(std::string &out, const char *field_name, const uint8_t *data, size_t len, - int indent = 2) { +static void dump_bytes_field(DumpBuffer &out, const char *field_name, const uint8_t *data, size_t len, int indent = 2) { char hex_buf[format_hex_pretty_size(160)]; append_field_prefix(out, field_name, indent); format_hex_pretty_to(hex_buf, data, len); @@ -743,40 +748,59 @@ template<> const char *proto_enum_to_string(enums: } #endif -void HelloRequest::dump_to(std::string &out) const { +const char *HelloRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "HelloRequest"); dump_field(out, "client_info", this->client_info); dump_field(out, "api_version_major", this->api_version_major); dump_field(out, "api_version_minor", this->api_version_minor); + return out.c_str(); } -void HelloResponse::dump_to(std::string &out) const { +const char *HelloResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "HelloResponse"); dump_field(out, "api_version_major", this->api_version_major); dump_field(out, "api_version_minor", this->api_version_minor); dump_field(out, "server_info", this->server_info); dump_field(out, "name", this->name); + return out.c_str(); +} +const char *DisconnectRequest::dump_to(DumpBuffer &out) const { + out.append("DisconnectRequest {}"); + return out.c_str(); +} +const char *DisconnectResponse::dump_to(DumpBuffer &out) const { + out.append("DisconnectResponse {}"); + return out.c_str(); +} +const char *PingRequest::dump_to(DumpBuffer &out) const { + out.append("PingRequest {}"); + return out.c_str(); +} +const char *PingResponse::dump_to(DumpBuffer &out) const { + out.append("PingResponse {}"); + return out.c_str(); +} +const char *DeviceInfoRequest::dump_to(DumpBuffer &out) const { + out.append("DeviceInfoRequest {}"); + return out.c_str(); } -void DisconnectRequest::dump_to(std::string &out) const { out.append("DisconnectRequest {}"); } -void DisconnectResponse::dump_to(std::string &out) const { out.append("DisconnectResponse {}"); } -void PingRequest::dump_to(std::string &out) const { out.append("PingRequest {}"); } -void PingResponse::dump_to(std::string &out) const { out.append("PingResponse {}"); } -void DeviceInfoRequest::dump_to(std::string &out) const { out.append("DeviceInfoRequest {}"); } #ifdef USE_AREAS -void AreaInfo::dump_to(std::string &out) const { +const char *AreaInfo::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "AreaInfo"); dump_field(out, "area_id", this->area_id); dump_field(out, "name", this->name); + return out.c_str(); } #endif #ifdef USE_DEVICES -void DeviceInfo::dump_to(std::string &out) const { +const char *DeviceInfo::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "DeviceInfo"); dump_field(out, "device_id", this->device_id); dump_field(out, "name", this->name); dump_field(out, "area_id", this->area_id); + return out.c_str(); } #endif -void DeviceInfoResponse::dump_to(std::string &out) const { +const char *DeviceInfoResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "DeviceInfoResponse"); dump_field(out, "name", this->name); dump_field(out, "mac_address", this->mac_address); @@ -837,12 +861,22 @@ void DeviceInfoResponse::dump_to(std::string &out) const { #ifdef USE_ZWAVE_PROXY dump_field(out, "zwave_home_id", this->zwave_home_id); #endif + return out.c_str(); +} +const char *ListEntitiesRequest::dump_to(DumpBuffer &out) const { + out.append("ListEntitiesRequest {}"); + return out.c_str(); +} +const char *ListEntitiesDoneResponse::dump_to(DumpBuffer &out) const { + out.append("ListEntitiesDoneResponse {}"); + return out.c_str(); +} +const char *SubscribeStatesRequest::dump_to(DumpBuffer &out) const { + out.append("SubscribeStatesRequest {}"); + return out.c_str(); } -void ListEntitiesRequest::dump_to(std::string &out) const { out.append("ListEntitiesRequest {}"); } -void ListEntitiesDoneResponse::dump_to(std::string &out) const { out.append("ListEntitiesDoneResponse {}"); } -void SubscribeStatesRequest::dump_to(std::string &out) const { out.append("SubscribeStatesRequest {}"); } #ifdef USE_BINARY_SENSOR -void ListEntitiesBinarySensorResponse::dump_to(std::string &out) const { +const char *ListEntitiesBinarySensorResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesBinarySensorResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -857,8 +891,9 @@ void ListEntitiesBinarySensorResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void BinarySensorStateResponse::dump_to(std::string &out) const { +const char *BinarySensorStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BinarySensorStateResponse"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); @@ -866,10 +901,11 @@ void BinarySensorStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_COVER -void ListEntitiesCoverResponse::dump_to(std::string &out) const { +const char *ListEntitiesCoverResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesCoverResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -887,8 +923,9 @@ void ListEntitiesCoverResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void CoverStateResponse::dump_to(std::string &out) const { +const char *CoverStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "CoverStateResponse"); dump_field(out, "key", this->key); dump_field(out, "position", this->position); @@ -897,8 +934,9 @@ void CoverStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void CoverCommandRequest::dump_to(std::string &out) const { +const char *CoverCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "CoverCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "has_position", this->has_position); @@ -909,10 +947,11 @@ void CoverCommandRequest::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_FAN -void ListEntitiesFanResponse::dump_to(std::string &out) const { +const char *ListEntitiesFanResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesFanResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -932,8 +971,9 @@ void ListEntitiesFanResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void FanStateResponse::dump_to(std::string &out) const { +const char *FanStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "FanStateResponse"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); @@ -944,8 +984,9 @@ void FanStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void FanCommandRequest::dump_to(std::string &out) const { +const char *FanCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "FanCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "has_state", this->has_state); @@ -961,10 +1002,11 @@ void FanCommandRequest::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_LIGHT -void ListEntitiesLightResponse::dump_to(std::string &out) const { +const char *ListEntitiesLightResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesLightResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -985,8 +1027,9 @@ void ListEntitiesLightResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void LightStateResponse::dump_to(std::string &out) const { +const char *LightStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "LightStateResponse"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); @@ -1004,8 +1047,9 @@ void LightStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void LightCommandRequest::dump_to(std::string &out) const { +const char *LightCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "LightCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "has_state", this->has_state); @@ -1037,10 +1081,11 @@ void LightCommandRequest::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_SENSOR -void ListEntitiesSensorResponse::dump_to(std::string &out) const { +const char *ListEntitiesSensorResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesSensorResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -1058,8 +1103,9 @@ void ListEntitiesSensorResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void SensorStateResponse::dump_to(std::string &out) const { +const char *SensorStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "SensorStateResponse"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); @@ -1067,10 +1113,11 @@ void SensorStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_SWITCH -void ListEntitiesSwitchResponse::dump_to(std::string &out) const { +const char *ListEntitiesSwitchResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesSwitchResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -1085,26 +1132,29 @@ void ListEntitiesSwitchResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void SwitchStateResponse::dump_to(std::string &out) const { +const char *SwitchStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "SwitchStateResponse"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void SwitchCommandRequest::dump_to(std::string &out) const { +const char *SwitchCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "SwitchCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_TEXT_SENSOR -void ListEntitiesTextSensorResponse::dump_to(std::string &out) const { +const char *ListEntitiesTextSensorResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesTextSensorResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -1118,8 +1168,9 @@ void ListEntitiesTextSensorResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void TextSensorStateResponse::dump_to(std::string &out) const { +const char *TextSensorStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "TextSensorStateResponse"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); @@ -1127,38 +1178,45 @@ void TextSensorStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif -void SubscribeLogsRequest::dump_to(std::string &out) const { +const char *SubscribeLogsRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "SubscribeLogsRequest"); dump_field(out, "level", static_cast(this->level)); dump_field(out, "dump_config", this->dump_config); + return out.c_str(); } -void SubscribeLogsResponse::dump_to(std::string &out) const { +const char *SubscribeLogsResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "SubscribeLogsResponse"); dump_field(out, "level", static_cast(this->level)); dump_bytes_field(out, "message", this->message_ptr_, this->message_len_); + return out.c_str(); } #ifdef USE_API_NOISE -void NoiseEncryptionSetKeyRequest::dump_to(std::string &out) const { +const char *NoiseEncryptionSetKeyRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "NoiseEncryptionSetKeyRequest"); dump_bytes_field(out, "key", this->key, this->key_len); + return out.c_str(); } -void NoiseEncryptionSetKeyResponse::dump_to(std::string &out) const { +const char *NoiseEncryptionSetKeyResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "NoiseEncryptionSetKeyResponse"); dump_field(out, "success", this->success); + return out.c_str(); } #endif #ifdef USE_API_HOMEASSISTANT_SERVICES -void SubscribeHomeassistantServicesRequest::dump_to(std::string &out) const { +const char *SubscribeHomeassistantServicesRequest::dump_to(DumpBuffer &out) const { out.append("SubscribeHomeassistantServicesRequest {}"); + return out.c_str(); } -void HomeassistantServiceMap::dump_to(std::string &out) const { +const char *HomeassistantServiceMap::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "HomeassistantServiceMap"); dump_field(out, "key", this->key); dump_field(out, "value", this->value); + return out.c_str(); } -void HomeassistantActionRequest::dump_to(std::string &out) const { +const char *HomeassistantActionRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "HomeassistantActionRequest"); dump_field(out, "service", this->service); for (const auto &it : this->data) { @@ -1186,10 +1244,11 @@ void HomeassistantActionRequest::dump_to(std::string &out) const { #ifdef USE_API_HOMEASSISTANT_ACTION_RESPONSES_JSON dump_field(out, "response_template", this->response_template); #endif + return out.c_str(); } #endif #ifdef USE_API_HOMEASSISTANT_ACTION_RESPONSES -void HomeassistantActionResponse::dump_to(std::string &out) const { +const char *HomeassistantActionResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "HomeassistantActionResponse"); dump_field(out, "call_id", this->call_id); dump_field(out, "success", this->success); @@ -1197,38 +1256,47 @@ void HomeassistantActionResponse::dump_to(std::string &out) const { #ifdef USE_API_HOMEASSISTANT_ACTION_RESPONSES_JSON dump_bytes_field(out, "response_data", this->response_data, this->response_data_len); #endif + return out.c_str(); } #endif #ifdef USE_API_HOMEASSISTANT_STATES -void SubscribeHomeAssistantStatesRequest::dump_to(std::string &out) const { +const char *SubscribeHomeAssistantStatesRequest::dump_to(DumpBuffer &out) const { out.append("SubscribeHomeAssistantStatesRequest {}"); + return out.c_str(); } -void SubscribeHomeAssistantStateResponse::dump_to(std::string &out) const { +const char *SubscribeHomeAssistantStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "SubscribeHomeAssistantStateResponse"); dump_field(out, "entity_id", this->entity_id); dump_field(out, "attribute", this->attribute); dump_field(out, "once", this->once); + return out.c_str(); } -void HomeAssistantStateResponse::dump_to(std::string &out) const { +const char *HomeAssistantStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "HomeAssistantStateResponse"); dump_field(out, "entity_id", this->entity_id); dump_field(out, "state", this->state); dump_field(out, "attribute", this->attribute); + return out.c_str(); } #endif -void GetTimeRequest::dump_to(std::string &out) const { out.append("GetTimeRequest {}"); } -void GetTimeResponse::dump_to(std::string &out) const { +const char *GetTimeRequest::dump_to(DumpBuffer &out) const { + out.append("GetTimeRequest {}"); + return out.c_str(); +} +const char *GetTimeResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "GetTimeResponse"); dump_field(out, "epoch_seconds", this->epoch_seconds); dump_field(out, "timezone", this->timezone); + return out.c_str(); } #ifdef USE_API_USER_DEFINED_ACTIONS -void ListEntitiesServicesArgument::dump_to(std::string &out) const { +const char *ListEntitiesServicesArgument::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesServicesArgument"); dump_field(out, "name", this->name); dump_field(out, "type", static_cast(this->type)); + return out.c_str(); } -void ListEntitiesServicesResponse::dump_to(std::string &out) const { +const char *ListEntitiesServicesResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesServicesResponse"); dump_field(out, "name", this->name); dump_field(out, "key", this->key); @@ -1238,8 +1306,9 @@ void ListEntitiesServicesResponse::dump_to(std::string &out) const { out.append("\n"); } dump_field(out, "supports_response", static_cast(this->supports_response)); + return out.c_str(); } -void ExecuteServiceArgument::dump_to(std::string &out) const { +const char *ExecuteServiceArgument::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ExecuteServiceArgument"); dump_field(out, "bool_", this->bool_); dump_field(out, "legacy_int", this->legacy_int); @@ -1258,8 +1327,9 @@ void ExecuteServiceArgument::dump_to(std::string &out) const { for (const auto &it : this->string_array) { dump_field(out, "string_array", it, 4); } + return out.c_str(); } -void ExecuteServiceRequest::dump_to(std::string &out) const { +const char *ExecuteServiceRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ExecuteServiceRequest"); dump_field(out, "key", this->key); for (const auto &it : this->args) { @@ -1273,10 +1343,11 @@ void ExecuteServiceRequest::dump_to(std::string &out) const { #ifdef USE_API_USER_DEFINED_ACTION_RESPONSES dump_field(out, "return_response", this->return_response); #endif + return out.c_str(); } #endif #ifdef USE_API_USER_DEFINED_ACTION_RESPONSES -void ExecuteServiceResponse::dump_to(std::string &out) const { +const char *ExecuteServiceResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ExecuteServiceResponse"); dump_field(out, "call_id", this->call_id); dump_field(out, "success", this->success); @@ -1284,10 +1355,11 @@ void ExecuteServiceResponse::dump_to(std::string &out) const { #ifdef USE_API_USER_DEFINED_ACTION_RESPONSES_JSON dump_bytes_field(out, "response_data", this->response_data, this->response_data_len); #endif + return out.c_str(); } #endif #ifdef USE_CAMERA -void ListEntitiesCameraResponse::dump_to(std::string &out) const { +const char *ListEntitiesCameraResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesCameraResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -1300,8 +1372,9 @@ void ListEntitiesCameraResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void CameraImageResponse::dump_to(std::string &out) const { +const char *CameraImageResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "CameraImageResponse"); dump_field(out, "key", this->key); dump_bytes_field(out, "data", this->data_ptr_, this->data_len_); @@ -1309,15 +1382,17 @@ void CameraImageResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void CameraImageRequest::dump_to(std::string &out) const { +const char *CameraImageRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "CameraImageRequest"); dump_field(out, "single", this->single); dump_field(out, "stream", this->stream); + return out.c_str(); } #endif #ifdef USE_CLIMATE -void ListEntitiesClimateResponse::dump_to(std::string &out) const { +const char *ListEntitiesClimateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesClimateResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -1360,8 +1435,9 @@ void ListEntitiesClimateResponse::dump_to(std::string &out) const { dump_field(out, "device_id", this->device_id); #endif dump_field(out, "feature_flags", this->feature_flags); + return out.c_str(); } -void ClimateStateResponse::dump_to(std::string &out) const { +const char *ClimateStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ClimateStateResponse"); dump_field(out, "key", this->key); dump_field(out, "mode", static_cast(this->mode)); @@ -1380,8 +1456,9 @@ void ClimateStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void ClimateCommandRequest::dump_to(std::string &out) const { +const char *ClimateCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ClimateCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "has_mode", this->has_mode); @@ -1407,10 +1484,11 @@ void ClimateCommandRequest::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_WATER_HEATER -void ListEntitiesWaterHeaterResponse::dump_to(std::string &out) const { +const char *ListEntitiesWaterHeaterResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesWaterHeaterResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -1430,8 +1508,9 @@ void ListEntitiesWaterHeaterResponse::dump_to(std::string &out) const { dump_field(out, "supported_modes", static_cast(it), 4); } dump_field(out, "supported_features", this->supported_features); + return out.c_str(); } -void WaterHeaterStateResponse::dump_to(std::string &out) const { +const char *WaterHeaterStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "WaterHeaterStateResponse"); dump_field(out, "key", this->key); dump_field(out, "current_temperature", this->current_temperature); @@ -1443,8 +1522,9 @@ void WaterHeaterStateResponse::dump_to(std::string &out) const { dump_field(out, "state", this->state); dump_field(out, "target_temperature_low", this->target_temperature_low); dump_field(out, "target_temperature_high", this->target_temperature_high); + return out.c_str(); } -void WaterHeaterCommandRequest::dump_to(std::string &out) const { +const char *WaterHeaterCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "WaterHeaterCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "has_fields", this->has_fields); @@ -1456,10 +1536,11 @@ void WaterHeaterCommandRequest::dump_to(std::string &out) const { dump_field(out, "state", this->state); dump_field(out, "target_temperature_low", this->target_temperature_low); dump_field(out, "target_temperature_high", this->target_temperature_high); + return out.c_str(); } #endif #ifdef USE_NUMBER -void ListEntitiesNumberResponse::dump_to(std::string &out) const { +const char *ListEntitiesNumberResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesNumberResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -1478,8 +1559,9 @@ void ListEntitiesNumberResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void NumberStateResponse::dump_to(std::string &out) const { +const char *NumberStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "NumberStateResponse"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); @@ -1487,18 +1569,20 @@ void NumberStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void NumberCommandRequest::dump_to(std::string &out) const { +const char *NumberCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "NumberCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_SELECT -void ListEntitiesSelectResponse::dump_to(std::string &out) const { +const char *ListEntitiesSelectResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesSelectResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -1514,8 +1598,9 @@ void ListEntitiesSelectResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void SelectStateResponse::dump_to(std::string &out) const { +const char *SelectStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "SelectStateResponse"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); @@ -1523,18 +1608,20 @@ void SelectStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void SelectCommandRequest::dump_to(std::string &out) const { +const char *SelectCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "SelectCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_SIREN -void ListEntitiesSirenResponse::dump_to(std::string &out) const { +const char *ListEntitiesSirenResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesSirenResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -1552,16 +1639,18 @@ void ListEntitiesSirenResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void SirenStateResponse::dump_to(std::string &out) const { +const char *SirenStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "SirenStateResponse"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void SirenCommandRequest::dump_to(std::string &out) const { +const char *SirenCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "SirenCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "has_state", this->has_state); @@ -1575,10 +1664,11 @@ void SirenCommandRequest::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_LOCK -void ListEntitiesLockResponse::dump_to(std::string &out) const { +const char *ListEntitiesLockResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesLockResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -1595,16 +1685,18 @@ void ListEntitiesLockResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void LockStateResponse::dump_to(std::string &out) const { +const char *LockStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "LockStateResponse"); dump_field(out, "key", this->key); dump_field(out, "state", static_cast(this->state)); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void LockCommandRequest::dump_to(std::string &out) const { +const char *LockCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "LockCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "command", static_cast(this->command)); @@ -1613,10 +1705,11 @@ void LockCommandRequest::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_BUTTON -void ListEntitiesButtonResponse::dump_to(std::string &out) const { +const char *ListEntitiesButtonResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesButtonResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -1630,25 +1723,28 @@ void ListEntitiesButtonResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void ButtonCommandRequest::dump_to(std::string &out) const { +const char *ButtonCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ButtonCommandRequest"); dump_field(out, "key", this->key); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_MEDIA_PLAYER -void MediaPlayerSupportedFormat::dump_to(std::string &out) const { +const char *MediaPlayerSupportedFormat::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "MediaPlayerSupportedFormat"); dump_field(out, "format", this->format); dump_field(out, "sample_rate", this->sample_rate); dump_field(out, "num_channels", this->num_channels); dump_field(out, "purpose", static_cast(this->purpose)); dump_field(out, "sample_bytes", this->sample_bytes); + return out.c_str(); } -void ListEntitiesMediaPlayerResponse::dump_to(std::string &out) const { +const char *ListEntitiesMediaPlayerResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesMediaPlayerResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -1668,8 +1764,9 @@ void ListEntitiesMediaPlayerResponse::dump_to(std::string &out) const { dump_field(out, "device_id", this->device_id); #endif dump_field(out, "feature_flags", this->feature_flags); + return out.c_str(); } -void MediaPlayerStateResponse::dump_to(std::string &out) const { +const char *MediaPlayerStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "MediaPlayerStateResponse"); dump_field(out, "key", this->key); dump_field(out, "state", static_cast(this->state)); @@ -1678,8 +1775,9 @@ void MediaPlayerStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void MediaPlayerCommandRequest::dump_to(std::string &out) const { +const char *MediaPlayerCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "MediaPlayerCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "has_command", this->has_command); @@ -1693,55 +1791,63 @@ void MediaPlayerCommandRequest::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_BLUETOOTH_PROXY -void SubscribeBluetoothLEAdvertisementsRequest::dump_to(std::string &out) const { +const char *SubscribeBluetoothLEAdvertisementsRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "SubscribeBluetoothLEAdvertisementsRequest"); dump_field(out, "flags", this->flags); + return out.c_str(); } -void BluetoothLERawAdvertisement::dump_to(std::string &out) const { +const char *BluetoothLERawAdvertisement::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothLERawAdvertisement"); dump_field(out, "address", this->address); dump_field(out, "rssi", this->rssi); dump_field(out, "address_type", this->address_type); dump_bytes_field(out, "data", this->data, this->data_len); + return out.c_str(); } -void BluetoothLERawAdvertisementsResponse::dump_to(std::string &out) const { +const char *BluetoothLERawAdvertisementsResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothLERawAdvertisementsResponse"); for (uint16_t i = 0; i < this->advertisements_len; i++) { out.append(" advertisements: "); this->advertisements[i].dump_to(out); out.append("\n"); } + return out.c_str(); } -void BluetoothDeviceRequest::dump_to(std::string &out) const { +const char *BluetoothDeviceRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothDeviceRequest"); dump_field(out, "address", this->address); dump_field(out, "request_type", static_cast(this->request_type)); dump_field(out, "has_address_type", this->has_address_type); dump_field(out, "address_type", this->address_type); + return out.c_str(); } -void BluetoothDeviceConnectionResponse::dump_to(std::string &out) const { +const char *BluetoothDeviceConnectionResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothDeviceConnectionResponse"); dump_field(out, "address", this->address); dump_field(out, "connected", this->connected); dump_field(out, "mtu", this->mtu); dump_field(out, "error", this->error); + return out.c_str(); } -void BluetoothGATTGetServicesRequest::dump_to(std::string &out) const { +const char *BluetoothGATTGetServicesRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTGetServicesRequest"); dump_field(out, "address", this->address); + return out.c_str(); } -void BluetoothGATTDescriptor::dump_to(std::string &out) const { +const char *BluetoothGATTDescriptor::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTDescriptor"); for (const auto &it : this->uuid) { dump_field(out, "uuid", it, 4); } dump_field(out, "handle", this->handle); dump_field(out, "short_uuid", this->short_uuid); + return out.c_str(); } -void BluetoothGATTCharacteristic::dump_to(std::string &out) const { +const char *BluetoothGATTCharacteristic::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTCharacteristic"); for (const auto &it : this->uuid) { dump_field(out, "uuid", it, 4); @@ -1754,8 +1860,9 @@ void BluetoothGATTCharacteristic::dump_to(std::string &out) const { out.append("\n"); } dump_field(out, "short_uuid", this->short_uuid); + return out.c_str(); } -void BluetoothGATTService::dump_to(std::string &out) const { +const char *BluetoothGATTService::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTService"); for (const auto &it : this->uuid) { dump_field(out, "uuid", it, 4); @@ -1767,8 +1874,9 @@ void BluetoothGATTService::dump_to(std::string &out) const { out.append("\n"); } dump_field(out, "short_uuid", this->short_uuid); + return out.c_str(); } -void BluetoothGATTGetServicesResponse::dump_to(std::string &out) const { +const char *BluetoothGATTGetServicesResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTGetServicesResponse"); dump_field(out, "address", this->address); for (const auto &it : this->services) { @@ -1776,124 +1884,146 @@ void BluetoothGATTGetServicesResponse::dump_to(std::string &out) const { it.dump_to(out); out.append("\n"); } + return out.c_str(); } -void BluetoothGATTGetServicesDoneResponse::dump_to(std::string &out) const { +const char *BluetoothGATTGetServicesDoneResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTGetServicesDoneResponse"); dump_field(out, "address", this->address); + return out.c_str(); } -void BluetoothGATTReadRequest::dump_to(std::string &out) const { +const char *BluetoothGATTReadRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTReadRequest"); dump_field(out, "address", this->address); dump_field(out, "handle", this->handle); + return out.c_str(); } -void BluetoothGATTReadResponse::dump_to(std::string &out) const { +const char *BluetoothGATTReadResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTReadResponse"); dump_field(out, "address", this->address); dump_field(out, "handle", this->handle); dump_bytes_field(out, "data", this->data_ptr_, this->data_len_); + return out.c_str(); } -void BluetoothGATTWriteRequest::dump_to(std::string &out) const { +const char *BluetoothGATTWriteRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTWriteRequest"); dump_field(out, "address", this->address); dump_field(out, "handle", this->handle); dump_field(out, "response", this->response); dump_bytes_field(out, "data", this->data, this->data_len); + return out.c_str(); } -void BluetoothGATTReadDescriptorRequest::dump_to(std::string &out) const { +const char *BluetoothGATTReadDescriptorRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTReadDescriptorRequest"); dump_field(out, "address", this->address); dump_field(out, "handle", this->handle); + return out.c_str(); } -void BluetoothGATTWriteDescriptorRequest::dump_to(std::string &out) const { +const char *BluetoothGATTWriteDescriptorRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTWriteDescriptorRequest"); dump_field(out, "address", this->address); dump_field(out, "handle", this->handle); dump_bytes_field(out, "data", this->data, this->data_len); + return out.c_str(); } -void BluetoothGATTNotifyRequest::dump_to(std::string &out) const { +const char *BluetoothGATTNotifyRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTNotifyRequest"); dump_field(out, "address", this->address); dump_field(out, "handle", this->handle); dump_field(out, "enable", this->enable); + return out.c_str(); } -void BluetoothGATTNotifyDataResponse::dump_to(std::string &out) const { +const char *BluetoothGATTNotifyDataResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTNotifyDataResponse"); dump_field(out, "address", this->address); dump_field(out, "handle", this->handle); dump_bytes_field(out, "data", this->data_ptr_, this->data_len_); + return out.c_str(); } -void SubscribeBluetoothConnectionsFreeRequest::dump_to(std::string &out) const { +const char *SubscribeBluetoothConnectionsFreeRequest::dump_to(DumpBuffer &out) const { out.append("SubscribeBluetoothConnectionsFreeRequest {}"); + return out.c_str(); } -void BluetoothConnectionsFreeResponse::dump_to(std::string &out) const { +const char *BluetoothConnectionsFreeResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothConnectionsFreeResponse"); dump_field(out, "free", this->free); dump_field(out, "limit", this->limit); for (const auto &it : this->allocated) { dump_field(out, "allocated", it, 4); } + return out.c_str(); } -void BluetoothGATTErrorResponse::dump_to(std::string &out) const { +const char *BluetoothGATTErrorResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTErrorResponse"); dump_field(out, "address", this->address); dump_field(out, "handle", this->handle); dump_field(out, "error", this->error); + return out.c_str(); } -void BluetoothGATTWriteResponse::dump_to(std::string &out) const { +const char *BluetoothGATTWriteResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTWriteResponse"); dump_field(out, "address", this->address); dump_field(out, "handle", this->handle); + return out.c_str(); } -void BluetoothGATTNotifyResponse::dump_to(std::string &out) const { +const char *BluetoothGATTNotifyResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothGATTNotifyResponse"); dump_field(out, "address", this->address); dump_field(out, "handle", this->handle); + return out.c_str(); } -void BluetoothDevicePairingResponse::dump_to(std::string &out) const { +const char *BluetoothDevicePairingResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothDevicePairingResponse"); dump_field(out, "address", this->address); dump_field(out, "paired", this->paired); dump_field(out, "error", this->error); + return out.c_str(); } -void BluetoothDeviceUnpairingResponse::dump_to(std::string &out) const { +const char *BluetoothDeviceUnpairingResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothDeviceUnpairingResponse"); dump_field(out, "address", this->address); dump_field(out, "success", this->success); dump_field(out, "error", this->error); + return out.c_str(); } -void UnsubscribeBluetoothLEAdvertisementsRequest::dump_to(std::string &out) const { +const char *UnsubscribeBluetoothLEAdvertisementsRequest::dump_to(DumpBuffer &out) const { out.append("UnsubscribeBluetoothLEAdvertisementsRequest {}"); + return out.c_str(); } -void BluetoothDeviceClearCacheResponse::dump_to(std::string &out) const { +const char *BluetoothDeviceClearCacheResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothDeviceClearCacheResponse"); dump_field(out, "address", this->address); dump_field(out, "success", this->success); dump_field(out, "error", this->error); + return out.c_str(); } -void BluetoothScannerStateResponse::dump_to(std::string &out) const { +const char *BluetoothScannerStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothScannerStateResponse"); dump_field(out, "state", static_cast(this->state)); dump_field(out, "mode", static_cast(this->mode)); dump_field(out, "configured_mode", static_cast(this->configured_mode)); + return out.c_str(); } -void BluetoothScannerSetModeRequest::dump_to(std::string &out) const { +const char *BluetoothScannerSetModeRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "BluetoothScannerSetModeRequest"); dump_field(out, "mode", static_cast(this->mode)); + return out.c_str(); } #endif #ifdef USE_VOICE_ASSISTANT -void SubscribeVoiceAssistantRequest::dump_to(std::string &out) const { +const char *SubscribeVoiceAssistantRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "SubscribeVoiceAssistantRequest"); dump_field(out, "subscribe", this->subscribe); dump_field(out, "flags", this->flags); + return out.c_str(); } -void VoiceAssistantAudioSettings::dump_to(std::string &out) const { +const char *VoiceAssistantAudioSettings::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantAudioSettings"); dump_field(out, "noise_suppression_level", this->noise_suppression_level); dump_field(out, "auto_gain", this->auto_gain); dump_field(out, "volume_multiplier", this->volume_multiplier); + return out.c_str(); } -void VoiceAssistantRequest::dump_to(std::string &out) const { +const char *VoiceAssistantRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantRequest"); dump_field(out, "start", this->start); dump_field(out, "conversation_id", this->conversation_id); @@ -1902,18 +2032,21 @@ void VoiceAssistantRequest::dump_to(std::string &out) const { this->audio_settings.dump_to(out); out.append("\n"); dump_field(out, "wake_word_phrase", this->wake_word_phrase); + return out.c_str(); } -void VoiceAssistantResponse::dump_to(std::string &out) const { +const char *VoiceAssistantResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantResponse"); dump_field(out, "port", this->port); dump_field(out, "error", this->error); + return out.c_str(); } -void VoiceAssistantEventData::dump_to(std::string &out) const { +const char *VoiceAssistantEventData::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantEventData"); dump_field(out, "name", this->name); dump_field(out, "value", this->value); + return out.c_str(); } -void VoiceAssistantEventResponse::dump_to(std::string &out) const { +const char *VoiceAssistantEventResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantEventResponse"); dump_field(out, "event_type", static_cast(this->event_type)); for (const auto &it : this->data) { @@ -1921,13 +2054,15 @@ void VoiceAssistantEventResponse::dump_to(std::string &out) const { it.dump_to(out); out.append("\n"); } + return out.c_str(); } -void VoiceAssistantAudio::dump_to(std::string &out) const { +const char *VoiceAssistantAudio::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantAudio"); dump_bytes_field(out, "data", this->data, this->data_len); dump_field(out, "end", this->end); + return out.c_str(); } -void VoiceAssistantTimerEventResponse::dump_to(std::string &out) const { +const char *VoiceAssistantTimerEventResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantTimerEventResponse"); dump_field(out, "event_type", static_cast(this->event_type)); dump_field(out, "timer_id", this->timer_id); @@ -1935,27 +2070,31 @@ void VoiceAssistantTimerEventResponse::dump_to(std::string &out) const { dump_field(out, "total_seconds", this->total_seconds); dump_field(out, "seconds_left", this->seconds_left); dump_field(out, "is_active", this->is_active); + return out.c_str(); } -void VoiceAssistantAnnounceRequest::dump_to(std::string &out) const { +const char *VoiceAssistantAnnounceRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantAnnounceRequest"); dump_field(out, "media_id", this->media_id); dump_field(out, "text", this->text); dump_field(out, "preannounce_media_id", this->preannounce_media_id); dump_field(out, "start_conversation", this->start_conversation); + return out.c_str(); } -void VoiceAssistantAnnounceFinished::dump_to(std::string &out) const { +const char *VoiceAssistantAnnounceFinished::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantAnnounceFinished"); dump_field(out, "success", this->success); + return out.c_str(); } -void VoiceAssistantWakeWord::dump_to(std::string &out) const { +const char *VoiceAssistantWakeWord::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantWakeWord"); dump_field(out, "id", this->id); dump_field(out, "wake_word", this->wake_word); for (const auto &it : this->trained_languages) { dump_field(out, "trained_languages", it, 4); } + return out.c_str(); } -void VoiceAssistantExternalWakeWord::dump_to(std::string &out) const { +const char *VoiceAssistantExternalWakeWord::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantExternalWakeWord"); dump_field(out, "id", this->id); dump_field(out, "wake_word", this->wake_word); @@ -1966,16 +2105,18 @@ void VoiceAssistantExternalWakeWord::dump_to(std::string &out) const { dump_field(out, "model_size", this->model_size); dump_field(out, "model_hash", this->model_hash); dump_field(out, "url", this->url); + return out.c_str(); } -void VoiceAssistantConfigurationRequest::dump_to(std::string &out) const { +const char *VoiceAssistantConfigurationRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantConfigurationRequest"); for (const auto &it : this->external_wake_words) { out.append(" external_wake_words: "); it.dump_to(out); out.append("\n"); } + return out.c_str(); } -void VoiceAssistantConfigurationResponse::dump_to(std::string &out) const { +const char *VoiceAssistantConfigurationResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantConfigurationResponse"); for (const auto &it : this->available_wake_words) { out.append(" available_wake_words: "); @@ -1986,16 +2127,18 @@ void VoiceAssistantConfigurationResponse::dump_to(std::string &out) const { dump_field(out, "active_wake_words", it, 4); } dump_field(out, "max_active_wake_words", this->max_active_wake_words); + return out.c_str(); } -void VoiceAssistantSetConfiguration::dump_to(std::string &out) const { +const char *VoiceAssistantSetConfiguration::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "VoiceAssistantSetConfiguration"); for (const auto &it : this->active_wake_words) { dump_field(out, "active_wake_words", it, 4); } + return out.c_str(); } #endif #ifdef USE_ALARM_CONTROL_PANEL -void ListEntitiesAlarmControlPanelResponse::dump_to(std::string &out) const { +const char *ListEntitiesAlarmControlPanelResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesAlarmControlPanelResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -2011,16 +2154,18 @@ void ListEntitiesAlarmControlPanelResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void AlarmControlPanelStateResponse::dump_to(std::string &out) const { +const char *AlarmControlPanelStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "AlarmControlPanelStateResponse"); dump_field(out, "key", this->key); dump_field(out, "state", static_cast(this->state)); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void AlarmControlPanelCommandRequest::dump_to(std::string &out) const { +const char *AlarmControlPanelCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "AlarmControlPanelCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "command", static_cast(this->command)); @@ -2028,10 +2173,11 @@ void AlarmControlPanelCommandRequest::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_TEXT -void ListEntitiesTextResponse::dump_to(std::string &out) const { +const char *ListEntitiesTextResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesTextResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -2048,8 +2194,9 @@ void ListEntitiesTextResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void TextStateResponse::dump_to(std::string &out) const { +const char *TextStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "TextStateResponse"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); @@ -2057,18 +2204,20 @@ void TextStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void TextCommandRequest::dump_to(std::string &out) const { +const char *TextCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "TextCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "state", this->state); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_DATETIME_DATE -void ListEntitiesDateResponse::dump_to(std::string &out) const { +const char *ListEntitiesDateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesDateResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -2081,8 +2230,9 @@ void ListEntitiesDateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void DateStateResponse::dump_to(std::string &out) const { +const char *DateStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "DateStateResponse"); dump_field(out, "key", this->key); dump_field(out, "missing_state", this->missing_state); @@ -2092,8 +2242,9 @@ void DateStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void DateCommandRequest::dump_to(std::string &out) const { +const char *DateCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "DateCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "year", this->year); @@ -2102,10 +2253,11 @@ void DateCommandRequest::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_DATETIME_TIME -void ListEntitiesTimeResponse::dump_to(std::string &out) const { +const char *ListEntitiesTimeResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesTimeResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -2118,8 +2270,9 @@ void ListEntitiesTimeResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void TimeStateResponse::dump_to(std::string &out) const { +const char *TimeStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "TimeStateResponse"); dump_field(out, "key", this->key); dump_field(out, "missing_state", this->missing_state); @@ -2129,8 +2282,9 @@ void TimeStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void TimeCommandRequest::dump_to(std::string &out) const { +const char *TimeCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "TimeCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "hour", this->hour); @@ -2139,10 +2293,11 @@ void TimeCommandRequest::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_EVENT -void ListEntitiesEventResponse::dump_to(std::string &out) const { +const char *ListEntitiesEventResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesEventResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -2159,18 +2314,20 @@ void ListEntitiesEventResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void EventResponse::dump_to(std::string &out) const { +const char *EventResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "EventResponse"); dump_field(out, "key", this->key); dump_field(out, "event_type", this->event_type); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_VALVE -void ListEntitiesValveResponse::dump_to(std::string &out) const { +const char *ListEntitiesValveResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesValveResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -2187,8 +2344,9 @@ void ListEntitiesValveResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void ValveStateResponse::dump_to(std::string &out) const { +const char *ValveStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ValveStateResponse"); dump_field(out, "key", this->key); dump_field(out, "position", this->position); @@ -2196,8 +2354,9 @@ void ValveStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void ValveCommandRequest::dump_to(std::string &out) const { +const char *ValveCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ValveCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "has_position", this->has_position); @@ -2206,10 +2365,11 @@ void ValveCommandRequest::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_DATETIME_DATETIME -void ListEntitiesDateTimeResponse::dump_to(std::string &out) const { +const char *ListEntitiesDateTimeResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesDateTimeResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -2222,8 +2382,9 @@ void ListEntitiesDateTimeResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void DateTimeStateResponse::dump_to(std::string &out) const { +const char *DateTimeStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "DateTimeStateResponse"); dump_field(out, "key", this->key); dump_field(out, "missing_state", this->missing_state); @@ -2231,18 +2392,20 @@ void DateTimeStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void DateTimeCommandRequest::dump_to(std::string &out) const { +const char *DateTimeCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "DateTimeCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "epoch_seconds", this->epoch_seconds); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_UPDATE -void ListEntitiesUpdateResponse::dump_to(std::string &out) const { +const char *ListEntitiesUpdateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesUpdateResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -2256,8 +2419,9 @@ void ListEntitiesUpdateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void UpdateStateResponse::dump_to(std::string &out) const { +const char *UpdateStateResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "UpdateStateResponse"); dump_field(out, "key", this->key); dump_field(out, "missing_state", this->missing_state); @@ -2272,29 +2436,33 @@ void UpdateStateResponse::dump_to(std::string &out) const { #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } -void UpdateCommandRequest::dump_to(std::string &out) const { +const char *UpdateCommandRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "UpdateCommandRequest"); dump_field(out, "key", this->key); dump_field(out, "command", static_cast(this->command)); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); #endif + return out.c_str(); } #endif #ifdef USE_ZWAVE_PROXY -void ZWaveProxyFrame::dump_to(std::string &out) const { +const char *ZWaveProxyFrame::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ZWaveProxyFrame"); dump_bytes_field(out, "data", this->data, this->data_len); + return out.c_str(); } -void ZWaveProxyRequest::dump_to(std::string &out) const { +const char *ZWaveProxyRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ZWaveProxyRequest"); dump_field(out, "type", static_cast(this->type)); dump_bytes_field(out, "data", this->data, this->data_len); + return out.c_str(); } #endif #ifdef USE_INFRARED -void ListEntitiesInfraredResponse::dump_to(std::string &out) const { +const char *ListEntitiesInfraredResponse::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "ListEntitiesInfraredResponse"); dump_field(out, "object_id", this->object_id); dump_field(out, "key", this->key); @@ -2308,10 +2476,11 @@ void ListEntitiesInfraredResponse::dump_to(std::string &out) const { dump_field(out, "device_id", this->device_id); #endif dump_field(out, "capabilities", this->capabilities); + return out.c_str(); } #endif #ifdef USE_IR_RF -void InfraredRFTransmitRawTimingsRequest::dump_to(std::string &out) const { +const char *InfraredRFTransmitRawTimingsRequest::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "InfraredRFTransmitRawTimingsRequest"); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); @@ -2321,12 +2490,13 @@ void InfraredRFTransmitRawTimingsRequest::dump_to(std::string &out) const { dump_field(out, "repeat_count", this->repeat_count); out.append(" timings: "); out.append("packed buffer ["); - out.append(std::to_string(this->timings_count_)); + append_uint(out, this->timings_count_); out.append(" values, "); - out.append(std::to_string(this->timings_length_)); + append_uint(out, this->timings_length_); out.append(" bytes]\n"); + return out.c_str(); } -void InfraredRFReceiveEvent::dump_to(std::string &out) const { +const char *InfraredRFReceiveEvent::dump_to(DumpBuffer &out) const { MessageDumpHelper helper(out, "InfraredRFReceiveEvent"); #ifdef USE_DEVICES dump_field(out, "device_id", this->device_id); @@ -2335,6 +2505,7 @@ void InfraredRFReceiveEvent::dump_to(std::string &out) const { for (const auto &it : *this->timings) { dump_field(out, "timings", it, 4); } + return out.c_str(); } #endif diff --git a/esphome/components/api/api_pb2_service.cpp b/esphome/components/api/api_pb2_service.cpp index 576b802443..4b7148e6c0 100644 --- a/esphome/components/api/api_pb2_service.cpp +++ b/esphome/components/api/api_pb2_service.cpp @@ -8,8 +8,12 @@ namespace esphome::api { static const char *const TAG = "api.service"; #ifdef HAS_PROTO_MESSAGE_DUMP -void APIServerConnectionBase::log_send_message_(const char *name, const std::string &dump) { - ESP_LOGVV(TAG, "send_message %s: %s", name, dump.c_str()); +void APIServerConnectionBase::log_send_message_(const char *name, const char *dump) { + ESP_LOGVV(TAG, "send_message %s: %s", name, dump); +} +void APIServerConnectionBase::log_receive_message_(const LogString *name, const ProtoMessage &msg) { + DumpBuffer dump_buf; + ESP_LOGVV(TAG, "%s: %s", LOG_STR_ARG(name), msg.dump_to(dump_buf)); } #endif @@ -19,7 +23,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, HelloRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_hello_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_hello_request"), msg); #endif this->on_hello_request(msg); break; @@ -28,7 +32,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, DisconnectRequest msg; // Empty message: no decode needed #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_disconnect_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_disconnect_request"), msg); #endif this->on_disconnect_request(msg); break; @@ -37,7 +41,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, DisconnectResponse msg; // Empty message: no decode needed #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_disconnect_response: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_disconnect_response"), msg); #endif this->on_disconnect_response(msg); break; @@ -46,7 +50,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, PingRequest msg; // Empty message: no decode needed #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_ping_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_ping_request"), msg); #endif this->on_ping_request(msg); break; @@ -55,7 +59,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, PingResponse msg; // Empty message: no decode needed #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_ping_response: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_ping_response"), msg); #endif this->on_ping_response(msg); break; @@ -64,7 +68,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, DeviceInfoRequest msg; // Empty message: no decode needed #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_device_info_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_device_info_request"), msg); #endif this->on_device_info_request(msg); break; @@ -73,7 +77,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, ListEntitiesRequest msg; // Empty message: no decode needed #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_list_entities_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_list_entities_request"), msg); #endif this->on_list_entities_request(msg); break; @@ -82,7 +86,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, SubscribeStatesRequest msg; // Empty message: no decode needed #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_subscribe_states_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_subscribe_states_request"), msg); #endif this->on_subscribe_states_request(msg); break; @@ -91,7 +95,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, SubscribeLogsRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_subscribe_logs_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_subscribe_logs_request"), msg); #endif this->on_subscribe_logs_request(msg); break; @@ -101,7 +105,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, CoverCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_cover_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_cover_command_request"), msg); #endif this->on_cover_command_request(msg); break; @@ -112,7 +116,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, FanCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_fan_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_fan_command_request"), msg); #endif this->on_fan_command_request(msg); break; @@ -123,7 +127,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, LightCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_light_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_light_command_request"), msg); #endif this->on_light_command_request(msg); break; @@ -134,7 +138,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, SwitchCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_switch_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_switch_command_request"), msg); #endif this->on_switch_command_request(msg); break; @@ -145,7 +149,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, SubscribeHomeassistantServicesRequest msg; // Empty message: no decode needed #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_subscribe_homeassistant_services_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_subscribe_homeassistant_services_request"), msg); #endif this->on_subscribe_homeassistant_services_request(msg); break; @@ -155,7 +159,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, GetTimeResponse msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_get_time_response: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_get_time_response"), msg); #endif this->on_get_time_response(msg); break; @@ -165,7 +169,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, SubscribeHomeAssistantStatesRequest msg; // Empty message: no decode needed #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_subscribe_home_assistant_states_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_subscribe_home_assistant_states_request"), msg); #endif this->on_subscribe_home_assistant_states_request(msg); break; @@ -176,7 +180,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, HomeAssistantStateResponse msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_home_assistant_state_response: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_home_assistant_state_response"), msg); #endif this->on_home_assistant_state_response(msg); break; @@ -187,7 +191,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, ExecuteServiceRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_execute_service_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_execute_service_request"), msg); #endif this->on_execute_service_request(msg); break; @@ -198,7 +202,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, CameraImageRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_camera_image_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_camera_image_request"), msg); #endif this->on_camera_image_request(msg); break; @@ -209,7 +213,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, ClimateCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_climate_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_climate_command_request"), msg); #endif this->on_climate_command_request(msg); break; @@ -220,7 +224,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, NumberCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_number_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_number_command_request"), msg); #endif this->on_number_command_request(msg); break; @@ -231,7 +235,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, SelectCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_select_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_select_command_request"), msg); #endif this->on_select_command_request(msg); break; @@ -242,7 +246,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, SirenCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_siren_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_siren_command_request"), msg); #endif this->on_siren_command_request(msg); break; @@ -253,7 +257,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, LockCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_lock_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_lock_command_request"), msg); #endif this->on_lock_command_request(msg); break; @@ -264,7 +268,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, ButtonCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_button_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_button_command_request"), msg); #endif this->on_button_command_request(msg); break; @@ -275,7 +279,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, MediaPlayerCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_media_player_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_media_player_command_request"), msg); #endif this->on_media_player_command_request(msg); break; @@ -286,7 +290,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, SubscribeBluetoothLEAdvertisementsRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_subscribe_bluetooth_le_advertisements_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_subscribe_bluetooth_le_advertisements_request"), msg); #endif this->on_subscribe_bluetooth_le_advertisements_request(msg); break; @@ -297,7 +301,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, BluetoothDeviceRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_bluetooth_device_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_bluetooth_device_request"), msg); #endif this->on_bluetooth_device_request(msg); break; @@ -308,7 +312,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, BluetoothGATTGetServicesRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_bluetooth_gatt_get_services_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_bluetooth_gatt_get_services_request"), msg); #endif this->on_bluetooth_gatt_get_services_request(msg); break; @@ -319,7 +323,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, BluetoothGATTReadRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_bluetooth_gatt_read_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_bluetooth_gatt_read_request"), msg); #endif this->on_bluetooth_gatt_read_request(msg); break; @@ -330,7 +334,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, BluetoothGATTWriteRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_bluetooth_gatt_write_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_bluetooth_gatt_write_request"), msg); #endif this->on_bluetooth_gatt_write_request(msg); break; @@ -341,7 +345,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, BluetoothGATTReadDescriptorRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_bluetooth_gatt_read_descriptor_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_bluetooth_gatt_read_descriptor_request"), msg); #endif this->on_bluetooth_gatt_read_descriptor_request(msg); break; @@ -352,7 +356,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, BluetoothGATTWriteDescriptorRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_bluetooth_gatt_write_descriptor_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_bluetooth_gatt_write_descriptor_request"), msg); #endif this->on_bluetooth_gatt_write_descriptor_request(msg); break; @@ -363,7 +367,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, BluetoothGATTNotifyRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_bluetooth_gatt_notify_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_bluetooth_gatt_notify_request"), msg); #endif this->on_bluetooth_gatt_notify_request(msg); break; @@ -374,7 +378,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, SubscribeBluetoothConnectionsFreeRequest msg; // Empty message: no decode needed #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_subscribe_bluetooth_connections_free_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_subscribe_bluetooth_connections_free_request"), msg); #endif this->on_subscribe_bluetooth_connections_free_request(msg); break; @@ -385,7 +389,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, UnsubscribeBluetoothLEAdvertisementsRequest msg; // Empty message: no decode needed #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_unsubscribe_bluetooth_le_advertisements_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_unsubscribe_bluetooth_le_advertisements_request"), msg); #endif this->on_unsubscribe_bluetooth_le_advertisements_request(msg); break; @@ -396,7 +400,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, SubscribeVoiceAssistantRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_subscribe_voice_assistant_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_subscribe_voice_assistant_request"), msg); #endif this->on_subscribe_voice_assistant_request(msg); break; @@ -407,7 +411,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, VoiceAssistantResponse msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_voice_assistant_response: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_voice_assistant_response"), msg); #endif this->on_voice_assistant_response(msg); break; @@ -418,7 +422,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, VoiceAssistantEventResponse msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_voice_assistant_event_response: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_voice_assistant_event_response"), msg); #endif this->on_voice_assistant_event_response(msg); break; @@ -429,7 +433,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, AlarmControlPanelCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_alarm_control_panel_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_alarm_control_panel_command_request"), msg); #endif this->on_alarm_control_panel_command_request(msg); break; @@ -440,7 +444,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, TextCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_text_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_text_command_request"), msg); #endif this->on_text_command_request(msg); break; @@ -451,7 +455,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, DateCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_date_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_date_command_request"), msg); #endif this->on_date_command_request(msg); break; @@ -462,7 +466,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, TimeCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_time_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_time_command_request"), msg); #endif this->on_time_command_request(msg); break; @@ -473,7 +477,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, VoiceAssistantAudio msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_voice_assistant_audio: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_voice_assistant_audio"), msg); #endif this->on_voice_assistant_audio(msg); break; @@ -484,7 +488,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, ValveCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_valve_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_valve_command_request"), msg); #endif this->on_valve_command_request(msg); break; @@ -495,7 +499,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, DateTimeCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_date_time_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_date_time_command_request"), msg); #endif this->on_date_time_command_request(msg); break; @@ -506,7 +510,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, VoiceAssistantTimerEventResponse msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_voice_assistant_timer_event_response: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_voice_assistant_timer_event_response"), msg); #endif this->on_voice_assistant_timer_event_response(msg); break; @@ -517,7 +521,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, UpdateCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_update_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_update_command_request"), msg); #endif this->on_update_command_request(msg); break; @@ -528,7 +532,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, VoiceAssistantAnnounceRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_voice_assistant_announce_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_voice_assistant_announce_request"), msg); #endif this->on_voice_assistant_announce_request(msg); break; @@ -539,7 +543,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, VoiceAssistantConfigurationRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_voice_assistant_configuration_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_voice_assistant_configuration_request"), msg); #endif this->on_voice_assistant_configuration_request(msg); break; @@ -550,7 +554,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, VoiceAssistantSetConfiguration msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_voice_assistant_set_configuration: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_voice_assistant_set_configuration"), msg); #endif this->on_voice_assistant_set_configuration(msg); break; @@ -561,7 +565,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, NoiseEncryptionSetKeyRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_noise_encryption_set_key_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_noise_encryption_set_key_request"), msg); #endif this->on_noise_encryption_set_key_request(msg); break; @@ -572,7 +576,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, BluetoothScannerSetModeRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_bluetooth_scanner_set_mode_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_bluetooth_scanner_set_mode_request"), msg); #endif this->on_bluetooth_scanner_set_mode_request(msg); break; @@ -583,7 +587,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, ZWaveProxyFrame msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_z_wave_proxy_frame: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_z_wave_proxy_frame"), msg); #endif this->on_z_wave_proxy_frame(msg); break; @@ -594,7 +598,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, ZWaveProxyRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_z_wave_proxy_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_z_wave_proxy_request"), msg); #endif this->on_z_wave_proxy_request(msg); break; @@ -605,7 +609,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, HomeassistantActionResponse msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_homeassistant_action_response: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_homeassistant_action_response"), msg); #endif this->on_homeassistant_action_response(msg); break; @@ -616,7 +620,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, WaterHeaterCommandRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_water_heater_command_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_water_heater_command_request"), msg); #endif this->on_water_heater_command_request(msg); break; @@ -627,7 +631,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, InfraredRFTransmitRawTimingsRequest msg; msg.decode(msg_data, msg_size); #ifdef HAS_PROTO_MESSAGE_DUMP - ESP_LOGVV(TAG, "on_infrared_rf_transmit_raw_timings_request: %s", msg.dump().c_str()); + this->log_receive_message_(LOG_STR("on_infrared_rf_transmit_raw_timings_request"), msg); #endif this->on_infrared_rf_transmit_raw_timings_request(msg); break; diff --git a/esphome/components/api/api_pb2_service.h b/esphome/components/api/api_pb2_service.h index 4bd6a7b6a4..200991c282 100644 --- a/esphome/components/api/api_pb2_service.h +++ b/esphome/components/api/api_pb2_service.h @@ -12,14 +12,16 @@ class APIServerConnectionBase : public ProtoService { public: #ifdef HAS_PROTO_MESSAGE_DUMP protected: - void log_send_message_(const char *name, const std::string &dump); + void log_send_message_(const char *name, const char *dump); + void log_receive_message_(const LogString *name, const ProtoMessage &msg); public: #endif bool send_message(const ProtoMessage &msg, uint8_t message_type) { #ifdef HAS_PROTO_MESSAGE_DUMP - this->log_send_message_(msg.message_name(), msg.dump()); + DumpBuffer dump_buf; + this->log_send_message_(msg.message_name(), msg.dump_to(dump_buf)); #endif return this->send_message_(msg, message_type); } diff --git a/esphome/components/api/proto.cpp b/esphome/components/api/proto.cpp index 4f0d0846d7..eac26997cf 100644 --- a/esphome/components/api/proto.cpp +++ b/esphome/components/api/proto.cpp @@ -139,12 +139,4 @@ void ProtoDecodableMessage::decode(const uint8_t *buffer, size_t length) { } } -#ifdef HAS_PROTO_MESSAGE_DUMP -std::string ProtoMessage::dump() const { - std::string out; - this->dump_to(out); - return out; -} -#endif - } // namespace esphome::api diff --git a/esphome/components/api/proto.h b/esphome/components/api/proto.h index a336a9493d..2e0df297c3 100644 --- a/esphome/components/api/proto.h +++ b/esphome/components/api/proto.h @@ -362,6 +362,63 @@ class ProtoWriteBuffer { std::vector *buffer_; }; +#ifdef HAS_PROTO_MESSAGE_DUMP +/** + * Fixed-size buffer for message dumps - avoids heap allocation. + * Sized to match the logger's default tx_buffer_size (512 bytes) + * since anything larger gets truncated anyway. + */ +class DumpBuffer { + public: + // Matches default tx_buffer_size in logger component + static constexpr size_t CAPACITY = 512; + + DumpBuffer() : pos_(0) { buf_[0] = '\0'; } + + DumpBuffer &append(const char *str) { + if (str) { + append_impl_(str, strlen(str)); + } + return *this; + } + + DumpBuffer &append(const char *str, size_t len) { + append_impl_(str, len); + return *this; + } + + DumpBuffer &append(size_t n, char c) { + size_t space = CAPACITY - 1 - pos_; + if (n > space) + n = space; + if (n > 0) { + memset(buf_ + pos_, c, n); + pos_ += n; + buf_[pos_] = '\0'; + } + return *this; + } + + const char *c_str() const { return buf_; } + size_t size() const { return pos_; } + + private: + void append_impl_(const char *str, size_t len) { + size_t space = CAPACITY - 1 - pos_; + if (len > space) + len = space; + if (len > 0) { + memcpy(buf_ + pos_, str, len); + pos_ += len; + buf_[pos_] = '\0'; + } + } + + char buf_[CAPACITY]; + size_t pos_; +}; +#endif + class ProtoMessage { public: virtual ~ProtoMessage() = default; @@ -370,8 +427,7 @@ class ProtoMessage { // Default implementation for messages with no fields virtual void calculate_size(ProtoSize &size) const {} #ifdef HAS_PROTO_MESSAGE_DUMP - std::string dump() const; - virtual void dump_to(std::string &out) const = 0; + virtual const char *dump_to(DumpBuffer &out) const = 0; virtual const char *message_name() const { return "unknown"; } #endif }; diff --git a/script/api_protobuf/api_protobuf.py b/script/api_protobuf/api_protobuf.py index a10a912186..7625458f9f 100755 --- a/script/api_protobuf/api_protobuf.py +++ b/script/api_protobuf/api_protobuf.py @@ -990,9 +990,9 @@ class PackedBufferTypeInfo(TypeInfo): return ( f'out.append(" {self.name}: ");\n' + 'out.append("packed buffer [");\n' - + f"out.append(std::to_string(this->{self.field_name}_count_));\n" + + f"append_uint(out, this->{self.field_name}_count_);\n" + 'out.append(" values, ");\n' - + f"out.append(std::to_string(this->{self.field_name}_length_));\n" + + f"append_uint(out, this->{self.field_name}_length_);\n" + 'out.append(" bytes]\\n");' ) @@ -2216,24 +2216,22 @@ def build_message_type( # dump_to method declaration in header prot = "#ifdef HAS_PROTO_MESSAGE_DUMP\n" - prot += "void dump_to(std::string &out) const override;\n" + prot += "const char *dump_to(DumpBuffer &out) const override;\n" prot += "#endif\n" public_content.append(prot) # dump_to implementation will go in dump_cpp - dump_impl = f"void {desc.name}::dump_to(std::string &out) const {{" + dump_impl = f"const char *{desc.name}::dump_to(DumpBuffer &out) const {{" if dump: # Always use MessageDumpHelper for consistent output formatting dump_impl += "\n" dump_impl += f' MessageDumpHelper helper(out, "{desc.name}");\n' dump_impl += indent("\n".join(dump)) + "\n" + dump_impl += " return out.c_str();\n" else: - o2 = f'out.append("{desc.name} {{}}");' - if len(dump_impl) + len(o2) + 3 < 120: - dump_impl += f" {o2} " - else: - dump_impl += "\n" - dump_impl += f" {o2}\n" + dump_impl += "\n" + dump_impl += f' out.append("{desc.name} {{}}");\n' + dump_impl += " return out.c_str();\n" dump_impl += "}\n" if base_class: @@ -2521,7 +2519,7 @@ def build_service_message_type( case += "// Empty message: no decode needed\n" if log: case += "#ifdef HAS_PROTO_MESSAGE_DUMP\n" - case += f'ESP_LOGVV(TAG, "{func}: %s", msg.dump().c_str());\n' + case += f'this->log_receive_message_(LOG_STR("{func}"), msg);\n' case += "#endif\n" case += f"this->{func}(msg);\n" case += "break;" @@ -2588,7 +2586,7 @@ namespace esphome::api { namespace esphome::api { // Helper function to append a quoted string, handling empty StringRef -static inline void append_quoted_string(std::string &out, const StringRef &ref) { +static inline void append_quoted_string(DumpBuffer &out, const StringRef &ref) { out.append("'"); if (!ref.empty()) { out.append(ref.c_str()); @@ -2597,83 +2595,89 @@ static inline void append_quoted_string(std::string &out, const StringRef &ref) } // Common helpers for dump_field functions -static inline void append_field_prefix(std::string &out, const char *field_name, int indent) { +static inline void append_field_prefix(DumpBuffer &out, const char *field_name, int indent) { out.append(indent, ' ').append(field_name).append(": "); } -static inline void append_with_newline(std::string &out, const char *str) { +static inline void append_with_newline(DumpBuffer &out, const char *str) { out.append(str); out.append("\\n"); } +static inline void append_uint(DumpBuffer &out, uint32_t value) { + char buf[16]; + snprintf(buf, sizeof(buf), "%" PRIu32, value); + out.append(buf); +} + // RAII helper for message dump formatting class MessageDumpHelper { public: - MessageDumpHelper(std::string &out, const char *message_name) : out_(out) { + MessageDumpHelper(DumpBuffer &out, const char *message_name) : out_(out) { out_.append(message_name); out_.append(" {\\n"); } ~MessageDumpHelper() { out_.append(" }"); } private: - std::string &out_; + DumpBuffer &out_; }; // Helper functions to reduce code duplication in dump methods -static void dump_field(std::string &out, const char *field_name, int32_t value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, int32_t value, int indent = 2) { char buffer[64]; append_field_prefix(out, field_name, indent); snprintf(buffer, 64, "%" PRId32, value); append_with_newline(out, buffer); } -static void dump_field(std::string &out, const char *field_name, uint32_t value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, uint32_t value, int indent = 2) { char buffer[64]; append_field_prefix(out, field_name, indent); snprintf(buffer, 64, "%" PRIu32, value); append_with_newline(out, buffer); } -static void dump_field(std::string &out, const char *field_name, float value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, float value, int indent = 2) { char buffer[64]; append_field_prefix(out, field_name, indent); snprintf(buffer, 64, "%g", value); append_with_newline(out, buffer); } -static void dump_field(std::string &out, const char *field_name, uint64_t value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, uint64_t value, int indent = 2) { char buffer[64]; append_field_prefix(out, field_name, indent); snprintf(buffer, 64, "%" PRIu64, value); append_with_newline(out, buffer); } -static void dump_field(std::string &out, const char *field_name, bool value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, bool value, int indent = 2) { append_field_prefix(out, field_name, indent); out.append(YESNO(value)); out.append("\\n"); } -static void dump_field(std::string &out, const char *field_name, const std::string &value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, const std::string &value, int indent = 2) { append_field_prefix(out, field_name, indent); - out.append("'").append(value).append("'"); + out.append("'").append(value.c_str()).append("'"); out.append("\\n"); } -static void dump_field(std::string &out, const char *field_name, StringRef value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, StringRef value, int indent = 2) { append_field_prefix(out, field_name, indent); append_quoted_string(out, value); out.append("\\n"); } -static void dump_field(std::string &out, const char *field_name, const char *value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, const char *value, int indent = 2) { append_field_prefix(out, field_name, indent); out.append("'").append(value).append("'"); out.append("\\n"); } template -static void dump_field(std::string &out, const char *field_name, T value, int indent = 2) { +static void dump_field(DumpBuffer &out, const char *field_name, T value, int indent = 2) { append_field_prefix(out, field_name, indent); out.append(proto_enum_to_string(value)); out.append("\\n"); @@ -2681,7 +2685,7 @@ static void dump_field(std::string &out, const char *field_name, T value, int in // Helper for bytes fields - uses stack buffer to avoid heap allocation // Buffer sized for 160 bytes of data (480 chars with separators) to fit typical log buffer -static void dump_bytes_field(std::string &out, const char *field_name, const uint8_t *data, size_t len, int indent = 2) { +static void dump_bytes_field(DumpBuffer &out, const char *field_name, const uint8_t *data, size_t len, int indent = 2) { char hex_buf[format_hex_pretty_size(160)]; append_field_prefix(out, field_name, indent); format_hex_pretty_to(hex_buf, data, len); @@ -2843,25 +2847,35 @@ static const char *const TAG = "api.service"; hpp += f"class {class_name} : public ProtoService {{\n" hpp += " public:\n" - # Add logging helper method declaration + # Add logging helper method declarations hpp += "#ifdef HAS_PROTO_MESSAGE_DUMP\n" hpp += " protected:\n" - hpp += " void log_send_message_(const char *name, const std::string &dump);\n" + hpp += " void log_send_message_(const char *name, const char *dump);\n" + hpp += ( + " void log_receive_message_(const LogString *name, const ProtoMessage &msg);\n" + ) hpp += " public:\n" hpp += "#endif\n\n" # Add non-template send_message method hpp += " bool send_message(const ProtoMessage &msg, uint8_t message_type) {\n" hpp += "#ifdef HAS_PROTO_MESSAGE_DUMP\n" - hpp += " this->log_send_message_(msg.message_name(), msg.dump());\n" + hpp += " DumpBuffer dump_buf;\n" + hpp += " this->log_send_message_(msg.message_name(), msg.dump_to(dump_buf));\n" hpp += "#endif\n" hpp += " return this->send_message_(msg, message_type);\n" hpp += " }\n\n" - # Add logging helper method implementation to cpp + # Add logging helper method implementations to cpp cpp += "#ifdef HAS_PROTO_MESSAGE_DUMP\n" - cpp += f"void {class_name}::log_send_message_(const char *name, const std::string &dump) {{\n" - cpp += ' ESP_LOGVV(TAG, "send_message %s: %s", name, dump.c_str());\n' + cpp += ( + f"void {class_name}::log_send_message_(const char *name, const char *dump) {{\n" + ) + cpp += ' ESP_LOGVV(TAG, "send_message %s: %s", name, dump);\n' + cpp += "}\n" + cpp += f"void {class_name}::log_receive_message_(const LogString *name, const ProtoMessage &msg) {{\n" + cpp += " DumpBuffer dump_buf;\n" + cpp += ' ESP_LOGVV(TAG, "%s: %s", LOG_STR_ARG(name), msg.dump_to(dump_buf));\n' cpp += "}\n" cpp += "#endif\n\n" From 3d40979c966ee6fb866d54e52bff6fa3314218c8 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 13 Jan 2026 08:05:04 -1000 Subject: [PATCH 10/12] [mqtt] Avoid intermediate string allocations in publish calls (#13174) --- .../components/mqtt/custom_mqtt_device.cpp | 8 +++--- esphome/components/mqtt/mqtt_climate.cpp | 25 ++++++++++--------- esphome/components/mqtt/mqtt_component.cpp | 6 ++++- esphome/components/mqtt/mqtt_component.h | 8 ++++++ esphome/components/mqtt/mqtt_cover.cpp | 8 +++--- esphome/components/mqtt/mqtt_fan.cpp | 5 ++-- esphome/components/mqtt/mqtt_sensor.cpp | 6 ++--- esphome/components/mqtt/mqtt_valve.cpp | 4 +-- 8 files changed, 42 insertions(+), 28 deletions(-) diff --git a/esphome/components/mqtt/custom_mqtt_device.cpp b/esphome/components/mqtt/custom_mqtt_device.cpp index c900e3861d..7ff65bb42c 100644 --- a/esphome/components/mqtt/custom_mqtt_device.cpp +++ b/esphome/components/mqtt/custom_mqtt_device.cpp @@ -13,13 +13,13 @@ bool CustomMQTTDevice::publish(const std::string &topic, const std::string &payl } bool CustomMQTTDevice::publish(const std::string &topic, float value, int8_t number_decimals) { char buf[VALUE_ACCURACY_MAX_LEN]; - value_accuracy_to_buf(buf, value, number_decimals); - return this->publish(topic, buf); + size_t len = value_accuracy_to_buf(buf, value, number_decimals); + return global_mqtt_client->publish(topic, buf, len); } bool CustomMQTTDevice::publish(const std::string &topic, int value) { char buffer[24]; - sprintf(buffer, "%d", value); - return this->publish(topic, buffer); + int len = snprintf(buffer, sizeof(buffer), "%d", value); + return global_mqtt_client->publish(topic, buffer, len); } bool CustomMQTTDevice::publish_json(const std::string &topic, const json::json_build_t &f, uint8_t qos, bool retain) { return global_mqtt_client->publish_json(topic, f, qos, retain); diff --git a/esphome/components/mqtt/mqtt_climate.cpp b/esphome/components/mqtt/mqtt_climate.cpp index c7e086115b..37d643f9e7 100644 --- a/esphome/components/mqtt/mqtt_climate.cpp +++ b/esphome/components/mqtt/mqtt_climate.cpp @@ -292,36 +292,37 @@ bool MQTTClimateComponent::publish_state_() { int8_t target_accuracy = traits.get_target_temperature_accuracy_decimals(); int8_t current_accuracy = traits.get_current_temperature_accuracy_decimals(); char payload[VALUE_ACCURACY_MAX_LEN]; + size_t len; if (traits.has_feature_flags(climate::CLIMATE_SUPPORTS_CURRENT_TEMPERATURE) && !std::isnan(this->device_->current_temperature)) { - value_accuracy_to_buf(payload, this->device_->current_temperature, current_accuracy); - if (!this->publish(this->get_current_temperature_state_topic(), payload)) + len = value_accuracy_to_buf(payload, this->device_->current_temperature, current_accuracy); + if (!this->publish(this->get_current_temperature_state_topic(), payload, len)) success = false; } if (traits.has_feature_flags(climate::CLIMATE_SUPPORTS_TWO_POINT_TARGET_TEMPERATURE | climate::CLIMATE_REQUIRES_TWO_POINT_TARGET_TEMPERATURE)) { - value_accuracy_to_buf(payload, this->device_->target_temperature_low, target_accuracy); - if (!this->publish(this->get_target_temperature_low_state_topic(), payload)) + len = value_accuracy_to_buf(payload, this->device_->target_temperature_low, target_accuracy); + if (!this->publish(this->get_target_temperature_low_state_topic(), payload, len)) success = false; - value_accuracy_to_buf(payload, this->device_->target_temperature_high, target_accuracy); - if (!this->publish(this->get_target_temperature_high_state_topic(), payload)) + len = value_accuracy_to_buf(payload, this->device_->target_temperature_high, target_accuracy); + if (!this->publish(this->get_target_temperature_high_state_topic(), payload, len)) success = false; } else { - value_accuracy_to_buf(payload, this->device_->target_temperature, target_accuracy); - if (!this->publish(this->get_target_temperature_state_topic(), payload)) + len = value_accuracy_to_buf(payload, this->device_->target_temperature, target_accuracy); + if (!this->publish(this->get_target_temperature_state_topic(), payload, len)) success = false; } if (traits.has_feature_flags(climate::CLIMATE_SUPPORTS_CURRENT_HUMIDITY) && !std::isnan(this->device_->current_humidity)) { - value_accuracy_to_buf(payload, this->device_->current_humidity, 0); - if (!this->publish(this->get_current_humidity_state_topic(), payload)) + len = value_accuracy_to_buf(payload, this->device_->current_humidity, 0); + if (!this->publish(this->get_current_humidity_state_topic(), payload, len)) success = false; } if (traits.has_feature_flags(climate::CLIMATE_SUPPORTS_TARGET_HUMIDITY) && !std::isnan(this->device_->target_humidity)) { - value_accuracy_to_buf(payload, this->device_->target_humidity, 0); - if (!this->publish(this->get_target_humidity_state_topic(), payload)) + len = value_accuracy_to_buf(payload, this->device_->target_humidity, 0); + if (!this->publish(this->get_target_humidity_state_topic(), payload, len)) success = false; } diff --git a/esphome/components/mqtt/mqtt_component.cpp b/esphome/components/mqtt/mqtt_component.cpp index 13f496c6a7..20c111de43 100644 --- a/esphome/components/mqtt/mqtt_component.cpp +++ b/esphome/components/mqtt/mqtt_component.cpp @@ -106,9 +106,13 @@ std::string MQTTComponent::get_command_topic_() const { } bool MQTTComponent::publish(const std::string &topic, const std::string &payload) { + return this->publish(topic, payload.data(), payload.size()); +} + +bool MQTTComponent::publish(const std::string &topic, const char *payload, size_t payload_length) { if (topic.empty()) return false; - return global_mqtt_client->publish(topic, payload, this->qos_, this->retain_); + return global_mqtt_client->publish(topic, payload, payload_length, this->qos_, this->retain_); } bool MQTTComponent::publish_json(const std::string &topic, const json::json_build_t &f) { diff --git a/esphome/components/mqtt/mqtt_component.h b/esphome/components/mqtt/mqtt_component.h index 11dfd093f3..676e3ad35d 100644 --- a/esphome/components/mqtt/mqtt_component.h +++ b/esphome/components/mqtt/mqtt_component.h @@ -140,6 +140,14 @@ class MQTTComponent : public Component { */ bool publish(const std::string &topic, const std::string &payload); + /** Send a MQTT message. + * + * @param topic The topic. + * @param payload The payload buffer. + * @param payload_length The length of the payload. + */ + bool publish(const std::string &topic, const char *payload, size_t payload_length); + /** Construct and send a JSON MQTT message. * * @param topic The topic. diff --git a/esphome/components/mqtt/mqtt_cover.cpp b/esphome/components/mqtt/mqtt_cover.cpp index 2164b5ca44..f2df6af236 100644 --- a/esphome/components/mqtt/mqtt_cover.cpp +++ b/esphome/components/mqtt/mqtt_cover.cpp @@ -99,14 +99,14 @@ bool MQTTCoverComponent::publish_state() { bool success = true; if (traits.get_supports_position()) { char pos[VALUE_ACCURACY_MAX_LEN]; - value_accuracy_to_buf(pos, roundf(this->cover_->position * 100), 0); - if (!this->publish(this->get_position_state_topic(), pos)) + size_t len = value_accuracy_to_buf(pos, roundf(this->cover_->position * 100), 0); + if (!this->publish(this->get_position_state_topic(), pos, len)) success = false; } if (traits.get_supports_tilt()) { char pos[VALUE_ACCURACY_MAX_LEN]; - value_accuracy_to_buf(pos, roundf(this->cover_->tilt * 100), 0); - if (!this->publish(this->get_tilt_state_topic(), pos)) + size_t len = value_accuracy_to_buf(pos, roundf(this->cover_->tilt * 100), 0); + if (!this->publish(this->get_tilt_state_topic(), pos, len)) success = false; } const char *state_s = this->cover_->current_operation == COVER_OPERATION_OPENING ? "opening" diff --git a/esphome/components/mqtt/mqtt_fan.cpp b/esphome/components/mqtt/mqtt_fan.cpp index bd6c98b679..a6f0503588 100644 --- a/esphome/components/mqtt/mqtt_fan.cpp +++ b/esphome/components/mqtt/mqtt_fan.cpp @@ -174,8 +174,9 @@ bool MQTTFanComponent::publish_state() { } auto traits = this->state_->get_traits(); if (traits.supports_speed()) { - std::string payload = to_string(this->state_->speed); - bool success = this->publish(this->get_speed_level_state_topic(), payload); + char buf[12]; + int len = snprintf(buf, sizeof(buf), "%d", this->state_->speed); + bool success = this->publish(this->get_speed_level_state_topic(), buf, len); failed = failed || !success; } return !failed; diff --git a/esphome/components/mqtt/mqtt_sensor.cpp b/esphome/components/mqtt/mqtt_sensor.cpp index cfe6923a5f..c14c889d47 100644 --- a/esphome/components/mqtt/mqtt_sensor.cpp +++ b/esphome/components/mqtt/mqtt_sensor.cpp @@ -80,11 +80,11 @@ bool MQTTSensorComponent::send_initial_state() { } bool MQTTSensorComponent::publish_state(float value) { if (mqtt::global_mqtt_client->is_publish_nan_as_none() && std::isnan(value)) - return this->publish(this->get_state_topic_(), "None"); + return this->publish(this->get_state_topic_(), "None", 4); int8_t accuracy = this->sensor_->get_accuracy_decimals(); char buf[VALUE_ACCURACY_MAX_LEN]; - value_accuracy_to_buf(buf, value, accuracy); - return this->publish(this->get_state_topic_(), buf); + size_t len = value_accuracy_to_buf(buf, value, accuracy); + return this->publish(this->get_state_topic_(), buf, len); } } // namespace esphome::mqtt diff --git a/esphome/components/mqtt/mqtt_valve.cpp b/esphome/components/mqtt/mqtt_valve.cpp index b4cc367bc5..2faaace46b 100644 --- a/esphome/components/mqtt/mqtt_valve.cpp +++ b/esphome/components/mqtt/mqtt_valve.cpp @@ -74,8 +74,8 @@ bool MQTTValveComponent::publish_state() { bool success = true; if (traits.get_supports_position()) { char pos[VALUE_ACCURACY_MAX_LEN]; - value_accuracy_to_buf(pos, roundf(this->valve_->position * 100), 0); - if (!this->publish(this->get_position_state_topic(), pos)) + size_t len = value_accuracy_to_buf(pos, roundf(this->valve_->position * 100), 0); + if (!this->publish(this->get_position_state_topic(), pos, len)) success = false; } const char *state_s = this->valve_->current_operation == VALVE_OPERATION_OPENING ? "opening" From 714188cfd87e01a57281a7b911cdcd7ea587996c Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 13 Jan 2026 08:13:37 -1000 Subject: [PATCH 11/12] [wifi] Fix ESP8266 disconnect callback order to set error flag before notifying listeners --- esphome/components/wifi/wifi_component_esp8266.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/esphome/components/wifi/wifi_component_esp8266.cpp b/esphome/components/wifi/wifi_component_esp8266.cpp index b7d820413c..a68111f045 100644 --- a/esphome/components/wifi/wifi_component_esp8266.cpp +++ b/esphome/components/wifi/wifi_component_esp8266.cpp @@ -543,6 +543,9 @@ void WiFiComponent::wifi_event_callback(System_Event_t *event) { } s_sta_connected = false; s_sta_connecting = false; + // Set error flag BEFORE notifying listeners so is_connected() returns + // correct state during listener callbacks (matches ESP-IDF behavior) + global_wifi_component->error_from_callback_ = true; #ifdef USE_WIFI_LISTENERS static constexpr uint8_t EMPTY_BSSID[6] = {}; for (auto *listener : global_wifi_component->connect_state_listeners_) { @@ -635,10 +638,6 @@ void WiFiComponent::wifi_event_callback(System_Event_t *event) { break; } - if (event->event == EVENT_STAMODE_DISCONNECTED) { - global_wifi_component->error_from_callback_ = true; - } - WiFiMockClass::_event_callback(event); } From 39f77a3315eea22ab74fd933a742fadb4500944a Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 13 Jan 2026 08:14:46 -1000 Subject: [PATCH 12/12] [wifi] Fix ESP8266 disconnect callback order to set error flag before notifying listeners --- esphome/components/wifi/wifi_component_esp8266.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/esphome/components/wifi/wifi_component_esp8266.cpp b/esphome/components/wifi/wifi_component_esp8266.cpp index a68111f045..61c4584d09 100644 --- a/esphome/components/wifi/wifi_component_esp8266.cpp +++ b/esphome/components/wifi/wifi_component_esp8266.cpp @@ -543,10 +543,12 @@ void WiFiComponent::wifi_event_callback(System_Event_t *event) { } s_sta_connected = false; s_sta_connecting = false; - // Set error flag BEFORE notifying listeners so is_connected() returns - // correct state during listener callbacks (matches ESP-IDF behavior) + // IMPORTANT: Set error flag BEFORE notifying listeners. + // This ensures is_connected() returns false during listener callbacks, + // which is critical for proper reconnection logic (e.g., roaming). global_wifi_component->error_from_callback_ = true; #ifdef USE_WIFI_LISTENERS + // Notify listeners AFTER setting error flag so they see correct state static constexpr uint8_t EMPTY_BSSID[6] = {}; for (auto *listener : global_wifi_component->connect_state_listeners_) { listener->on_wifi_connect_state(StringRef(), EMPTY_BSSID);