mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	Add common base classes for entity protobuf messages to reduce duplicate code
This commit is contained in:
		| @@ -266,6 +266,7 @@ enum EntityCategory { | ||||
| // ==================== BINARY SENSOR ==================== | ||||
| message ListEntitiesBinarySensorResponse { | ||||
|   option (id) = 12; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_BINARY_SENSOR"; | ||||
|  | ||||
| @@ -282,6 +283,7 @@ message ListEntitiesBinarySensorResponse { | ||||
| } | ||||
| message BinarySensorStateResponse { | ||||
|   option (id) = 21; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_BINARY_SENSOR"; | ||||
|   option (no_delay) = true; | ||||
| @@ -296,6 +298,7 @@ message BinarySensorStateResponse { | ||||
| // ==================== COVER ==================== | ||||
| message ListEntitiesCoverResponse { | ||||
|   option (id) = 13; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_COVER"; | ||||
|  | ||||
| @@ -325,6 +328,7 @@ enum CoverOperation { | ||||
| } | ||||
| message CoverStateResponse { | ||||
|   option (id) = 22; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_COVER"; | ||||
|   option (no_delay) = true; | ||||
| @@ -367,6 +371,7 @@ message CoverCommandRequest { | ||||
| // ==================== FAN ==================== | ||||
| message ListEntitiesFanResponse { | ||||
|   option (id) = 14; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_FAN"; | ||||
|  | ||||
| @@ -395,6 +400,7 @@ enum FanDirection { | ||||
| } | ||||
| message FanStateResponse { | ||||
|   option (id) = 23; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_FAN"; | ||||
|   option (no_delay) = true; | ||||
| @@ -444,6 +450,7 @@ enum ColorMode { | ||||
| } | ||||
| message ListEntitiesLightResponse { | ||||
|   option (id) = 15; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_LIGHT"; | ||||
|  | ||||
| @@ -467,6 +474,7 @@ message ListEntitiesLightResponse { | ||||
| } | ||||
| message LightStateResponse { | ||||
|   option (id) = 24; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_LIGHT"; | ||||
|   option (no_delay) = true; | ||||
| @@ -536,6 +544,7 @@ enum SensorLastResetType { | ||||
|  | ||||
| message ListEntitiesSensorResponse { | ||||
|   option (id) = 16; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_SENSOR"; | ||||
|  | ||||
| @@ -557,6 +566,7 @@ message ListEntitiesSensorResponse { | ||||
| } | ||||
| message SensorStateResponse { | ||||
|   option (id) = 25; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_SENSOR"; | ||||
|   option (no_delay) = true; | ||||
| @@ -571,6 +581,7 @@ message SensorStateResponse { | ||||
| // ==================== SWITCH ==================== | ||||
| message ListEntitiesSwitchResponse { | ||||
|   option (id) = 17; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_SWITCH"; | ||||
|  | ||||
| @@ -587,6 +598,7 @@ message ListEntitiesSwitchResponse { | ||||
| } | ||||
| message SwitchStateResponse { | ||||
|   option (id) = 26; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_SWITCH"; | ||||
|   option (no_delay) = true; | ||||
| @@ -607,6 +619,7 @@ message SwitchCommandRequest { | ||||
| // ==================== TEXT SENSOR ==================== | ||||
| message ListEntitiesTextSensorResponse { | ||||
|   option (id) = 18; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_TEXT_SENSOR"; | ||||
|  | ||||
| @@ -622,6 +635,7 @@ message ListEntitiesTextSensorResponse { | ||||
| } | ||||
| message TextSensorStateResponse { | ||||
|   option (id) = 27; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_TEXT_SENSOR"; | ||||
|   option (no_delay) = true; | ||||
| @@ -789,6 +803,7 @@ message ExecuteServiceRequest { | ||||
| // ==================== CAMERA ==================== | ||||
| message ListEntitiesCameraResponse { | ||||
|   option (id) = 43; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_ESP32_CAMERA"; | ||||
|  | ||||
| @@ -869,6 +884,7 @@ enum ClimatePreset { | ||||
| } | ||||
| message ListEntitiesClimateResponse { | ||||
|   option (id) = 46; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_CLIMATE"; | ||||
|  | ||||
| @@ -903,6 +919,7 @@ message ListEntitiesClimateResponse { | ||||
| } | ||||
| message ClimateStateResponse { | ||||
|   option (id) = 47; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_CLIMATE"; | ||||
|   option (no_delay) = true; | ||||
| @@ -964,6 +981,7 @@ enum NumberMode { | ||||
| } | ||||
| message ListEntitiesNumberResponse { | ||||
|   option (id) = 49; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_NUMBER"; | ||||
|  | ||||
| @@ -984,6 +1002,7 @@ message ListEntitiesNumberResponse { | ||||
| } | ||||
| message NumberStateResponse { | ||||
|   option (id) = 50; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_NUMBER"; | ||||
|   option (no_delay) = true; | ||||
| @@ -1007,6 +1026,7 @@ message NumberCommandRequest { | ||||
| // ==================== SELECT ==================== | ||||
| message ListEntitiesSelectResponse { | ||||
|   option (id) = 52; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_SELECT"; | ||||
|  | ||||
| @@ -1022,6 +1042,7 @@ message ListEntitiesSelectResponse { | ||||
| } | ||||
| message SelectStateResponse { | ||||
|   option (id) = 53; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_SELECT"; | ||||
|   option (no_delay) = true; | ||||
| @@ -1045,6 +1066,7 @@ message SelectCommandRequest { | ||||
| // ==================== SIREN ==================== | ||||
| message ListEntitiesSirenResponse { | ||||
|   option (id) = 55; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_SIREN"; | ||||
|  | ||||
| @@ -1062,6 +1084,7 @@ message ListEntitiesSirenResponse { | ||||
| } | ||||
| message SirenStateResponse { | ||||
|   option (id) = 56; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_SIREN"; | ||||
|   option (no_delay) = true; | ||||
| @@ -1102,6 +1125,7 @@ enum LockCommand  { | ||||
| } | ||||
| message ListEntitiesLockResponse { | ||||
|   option (id) = 58; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_LOCK"; | ||||
|  | ||||
| @@ -1123,6 +1147,7 @@ message ListEntitiesLockResponse { | ||||
| } | ||||
| message LockStateResponse { | ||||
|   option (id) = 59; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_LOCK"; | ||||
|   option (no_delay) = true; | ||||
| @@ -1145,6 +1170,7 @@ message LockCommandRequest { | ||||
| // ==================== BUTTON ==================== | ||||
| message ListEntitiesButtonResponse { | ||||
|   option (id) = 61; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_BUTTON"; | ||||
|  | ||||
| @@ -1196,6 +1222,7 @@ message MediaPlayerSupportedFormat { | ||||
| } | ||||
| message ListEntitiesMediaPlayerResponse { | ||||
|   option (id) = 63; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_MEDIA_PLAYER"; | ||||
|  | ||||
| @@ -1214,6 +1241,7 @@ message ListEntitiesMediaPlayerResponse { | ||||
| } | ||||
| message MediaPlayerStateResponse { | ||||
|   option (id) = 64; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_MEDIA_PLAYER"; | ||||
|   option (no_delay) = true; | ||||
| @@ -1735,6 +1763,7 @@ enum AlarmControlPanelStateCommand { | ||||
|  | ||||
| message ListEntitiesAlarmControlPanelResponse { | ||||
|   option (id) = 94; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_ALARM_CONTROL_PANEL"; | ||||
|  | ||||
| @@ -1752,6 +1781,7 @@ message ListEntitiesAlarmControlPanelResponse { | ||||
|  | ||||
| message AlarmControlPanelStateResponse { | ||||
|   option (id) = 95; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_ALARM_CONTROL_PANEL"; | ||||
|   option (no_delay) = true; | ||||
| @@ -1776,6 +1806,7 @@ enum TextMode { | ||||
| } | ||||
| message ListEntitiesTextResponse { | ||||
|   option (id) = 97; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_TEXT"; | ||||
|  | ||||
| @@ -1794,6 +1825,7 @@ message ListEntitiesTextResponse { | ||||
| } | ||||
| message TextStateResponse { | ||||
|   option (id) = 98; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_TEXT"; | ||||
|   option (no_delay) = true; | ||||
| @@ -1818,6 +1850,7 @@ message TextCommandRequest { | ||||
| // ==================== DATETIME DATE ==================== | ||||
| message ListEntitiesDateResponse { | ||||
|   option (id) = 100; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_DATETIME_DATE"; | ||||
|  | ||||
| @@ -1832,6 +1865,7 @@ message ListEntitiesDateResponse { | ||||
| } | ||||
| message DateStateResponse { | ||||
|   option (id) = 101; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_DATETIME_DATE"; | ||||
|   option (no_delay) = true; | ||||
| @@ -1859,6 +1893,7 @@ message DateCommandRequest { | ||||
| // ==================== DATETIME TIME ==================== | ||||
| message ListEntitiesTimeResponse { | ||||
|   option (id) = 103; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_DATETIME_TIME"; | ||||
|  | ||||
| @@ -1873,6 +1908,7 @@ message ListEntitiesTimeResponse { | ||||
| } | ||||
| message TimeStateResponse { | ||||
|   option (id) = 104; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_DATETIME_TIME"; | ||||
|   option (no_delay) = true; | ||||
| @@ -1900,6 +1936,7 @@ message TimeCommandRequest { | ||||
| // ==================== EVENT ==================== | ||||
| message ListEntitiesEventResponse { | ||||
|   option (id) = 107; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_EVENT"; | ||||
|  | ||||
| @@ -1917,6 +1954,7 @@ message ListEntitiesEventResponse { | ||||
| } | ||||
| message EventResponse { | ||||
|   option (id) = 108; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_EVENT"; | ||||
|  | ||||
| @@ -1927,6 +1965,7 @@ message EventResponse { | ||||
| // ==================== VALVE ==================== | ||||
| message ListEntitiesValveResponse { | ||||
|   option (id) = 109; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_VALVE"; | ||||
|  | ||||
| @@ -1952,6 +1991,7 @@ enum ValveOperation { | ||||
| } | ||||
| message ValveStateResponse { | ||||
|   option (id) = 110; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_VALVE"; | ||||
|   option (no_delay) = true; | ||||
| @@ -1976,6 +2016,7 @@ message ValveCommandRequest { | ||||
| // ==================== DATETIME DATETIME ==================== | ||||
| message ListEntitiesDateTimeResponse { | ||||
|   option (id) = 112; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_DATETIME_DATETIME"; | ||||
|  | ||||
| @@ -1990,6 +2031,7 @@ message ListEntitiesDateTimeResponse { | ||||
| } | ||||
| message DateTimeStateResponse { | ||||
|   option (id) = 113; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_DATETIME_DATETIME"; | ||||
|   option (no_delay) = true; | ||||
| @@ -2013,6 +2055,7 @@ message DateTimeCommandRequest { | ||||
| // ==================== UPDATE ==================== | ||||
| message ListEntitiesUpdateResponse { | ||||
|   option (id) = 116; | ||||
|   option (base_class) = "InfoResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_UPDATE"; | ||||
|  | ||||
| @@ -2028,6 +2071,7 @@ message ListEntitiesUpdateResponse { | ||||
| } | ||||
| message UpdateStateResponse { | ||||
|   option (id) = 117; | ||||
|   option (base_class) = "StateResponseProtoMessage"; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (ifdef) = "USE_UPDATE"; | ||||
|   option (no_delay) = true; | ||||
|   | ||||
| @@ -301,7 +301,7 @@ uint16_t APIConnection::try_send_binary_sensor_state(EntityBase *entity, APIConn | ||||
|   BinarySensorStateResponse resp; | ||||
|   resp.state = binary_sensor->state; | ||||
|   resp.missing_state = !binary_sensor->has_state(); | ||||
|   resp.key = binary_sensor->get_object_id_hash(); | ||||
|   fill_entity_state_base(binary_sensor, resp); | ||||
|   return encode_message_to_buffer(resp, BinarySensorStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
|  | ||||
| @@ -335,7 +335,7 @@ uint16_t APIConnection::try_send_cover_state(EntityBase *entity, APIConnection * | ||||
|   if (traits.get_supports_tilt()) | ||||
|     msg.tilt = cover->tilt; | ||||
|   msg.current_operation = static_cast<enums::CoverOperation>(cover->current_operation); | ||||
|   msg.key = cover->get_object_id_hash(); | ||||
|   fill_entity_state_base(cover, msg); | ||||
|   return encode_message_to_buffer(msg, CoverStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
| uint16_t APIConnection::try_send_cover_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, | ||||
| @@ -403,7 +403,7 @@ uint16_t APIConnection::try_send_fan_state(EntityBase *entity, APIConnection *co | ||||
|     msg.direction = static_cast<enums::FanDirection>(fan->direction); | ||||
|   if (traits.supports_preset_modes()) | ||||
|     msg.preset_mode = fan->preset_mode; | ||||
|   msg.key = fan->get_object_id_hash(); | ||||
|   fill_entity_state_base(fan, msg); | ||||
|   return encode_message_to_buffer(msg, FanStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
| uint16_t APIConnection::try_send_fan_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, | ||||
| @@ -470,7 +470,7 @@ uint16_t APIConnection::try_send_light_state(EntityBase *entity, APIConnection * | ||||
|   resp.warm_white = values.get_warm_white(); | ||||
|   if (light->supports_effects()) | ||||
|     resp.effect = light->get_effect_name(); | ||||
|   resp.key = light->get_object_id_hash(); | ||||
|   fill_entity_state_base(light, resp); | ||||
|   return encode_message_to_buffer(resp, LightStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
| uint16_t APIConnection::try_send_light_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, | ||||
| @@ -552,7 +552,7 @@ uint16_t APIConnection::try_send_sensor_state(EntityBase *entity, APIConnection | ||||
|   SensorStateResponse resp; | ||||
|   resp.state = sensor->state; | ||||
|   resp.missing_state = !sensor->has_state(); | ||||
|   resp.key = sensor->get_object_id_hash(); | ||||
|   fill_entity_state_base(sensor, resp); | ||||
|   return encode_message_to_buffer(resp, SensorStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
|  | ||||
| @@ -586,7 +586,7 @@ uint16_t APIConnection::try_send_switch_state(EntityBase *entity, APIConnection | ||||
|   auto *a_switch = static_cast<switch_::Switch *>(entity); | ||||
|   SwitchStateResponse resp; | ||||
|   resp.state = a_switch->state; | ||||
|   resp.key = a_switch->get_object_id_hash(); | ||||
|   fill_entity_state_base(a_switch, resp); | ||||
|   return encode_message_to_buffer(resp, SwitchStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
|  | ||||
| @@ -629,7 +629,7 @@ uint16_t APIConnection::try_send_text_sensor_state(EntityBase *entity, APIConnec | ||||
|   TextSensorStateResponse resp; | ||||
|   resp.state = text_sensor->state; | ||||
|   resp.missing_state = !text_sensor->has_state(); | ||||
|   resp.key = text_sensor->get_object_id_hash(); | ||||
|   fill_entity_state_base(text_sensor, resp); | ||||
|   return encode_message_to_buffer(resp, TextSensorStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
| uint16_t APIConnection::try_send_text_sensor_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, | ||||
| @@ -653,7 +653,7 @@ uint16_t APIConnection::try_send_climate_state(EntityBase *entity, APIConnection | ||||
|                                                bool is_single) { | ||||
|   auto *climate = static_cast<climate::Climate *>(entity); | ||||
|   ClimateStateResponse resp; | ||||
|   resp.key = climate->get_object_id_hash(); | ||||
|   fill_entity_state_base(climate, resp); | ||||
|   auto traits = climate->get_traits(); | ||||
|   resp.mode = static_cast<enums::ClimateMode>(climate->mode); | ||||
|   resp.action = static_cast<enums::ClimateAction>(climate->action); | ||||
| @@ -762,7 +762,7 @@ uint16_t APIConnection::try_send_number_state(EntityBase *entity, APIConnection | ||||
|   NumberStateResponse resp; | ||||
|   resp.state = number->state; | ||||
|   resp.missing_state = !number->has_state(); | ||||
|   resp.key = number->get_object_id_hash(); | ||||
|   fill_entity_state_base(number, resp); | ||||
|   return encode_message_to_buffer(resp, NumberStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
|  | ||||
| @@ -803,7 +803,7 @@ uint16_t APIConnection::try_send_date_state(EntityBase *entity, APIConnection *c | ||||
|   resp.year = date->year; | ||||
|   resp.month = date->month; | ||||
|   resp.day = date->day; | ||||
|   resp.key = date->get_object_id_hash(); | ||||
|   fill_entity_state_base(date, resp); | ||||
|   return encode_message_to_buffer(resp, DateStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
| void APIConnection::send_date_info(datetime::DateEntity *date) { | ||||
| @@ -840,7 +840,7 @@ uint16_t APIConnection::try_send_time_state(EntityBase *entity, APIConnection *c | ||||
|   resp.hour = time->hour; | ||||
|   resp.minute = time->minute; | ||||
|   resp.second = time->second; | ||||
|   resp.key = time->get_object_id_hash(); | ||||
|   fill_entity_state_base(time, resp); | ||||
|   return encode_message_to_buffer(resp, TimeStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
| void APIConnection::send_time_info(datetime::TimeEntity *time) { | ||||
| @@ -879,7 +879,7 @@ uint16_t APIConnection::try_send_datetime_state(EntityBase *entity, APIConnectio | ||||
|     ESPTime state = datetime->state_as_esptime(); | ||||
|     resp.epoch_seconds = state.timestamp; | ||||
|   } | ||||
|   resp.key = datetime->get_object_id_hash(); | ||||
|   fill_entity_state_base(datetime, resp); | ||||
|   return encode_message_to_buffer(resp, DateTimeStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
| void APIConnection::send_datetime_info(datetime::DateTimeEntity *datetime) { | ||||
| @@ -918,7 +918,7 @@ uint16_t APIConnection::try_send_text_state(EntityBase *entity, APIConnection *c | ||||
|   TextStateResponse resp; | ||||
|   resp.state = text->state; | ||||
|   resp.missing_state = !text->has_state(); | ||||
|   resp.key = text->get_object_id_hash(); | ||||
|   fill_entity_state_base(text, resp); | ||||
|   return encode_message_to_buffer(resp, TextStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
|  | ||||
| @@ -959,7 +959,7 @@ uint16_t APIConnection::try_send_select_state(EntityBase *entity, APIConnection | ||||
|   SelectStateResponse resp; | ||||
|   resp.state = select->state; | ||||
|   resp.missing_state = !select->has_state(); | ||||
|   resp.key = select->get_object_id_hash(); | ||||
|   fill_entity_state_base(select, resp); | ||||
|   return encode_message_to_buffer(resp, SelectStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
|  | ||||
| @@ -1019,7 +1019,7 @@ uint16_t APIConnection::try_send_lock_state(EntityBase *entity, APIConnection *c | ||||
|   auto *a_lock = static_cast<lock::Lock *>(entity); | ||||
|   LockStateResponse resp; | ||||
|   resp.state = static_cast<enums::LockState>(a_lock->state); | ||||
|   resp.key = a_lock->get_object_id_hash(); | ||||
|   fill_entity_state_base(a_lock, resp); | ||||
|   return encode_message_to_buffer(resp, LockStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
|  | ||||
| @@ -1063,7 +1063,7 @@ uint16_t APIConnection::try_send_valve_state(EntityBase *entity, APIConnection * | ||||
|   ValveStateResponse resp; | ||||
|   resp.position = valve->position; | ||||
|   resp.current_operation = static_cast<enums::ValveOperation>(valve->current_operation); | ||||
|   resp.key = valve->get_object_id_hash(); | ||||
|   fill_entity_state_base(valve, resp); | ||||
|   return encode_message_to_buffer(resp, ValveStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
| void APIConnection::send_valve_info(valve::Valve *valve) { | ||||
| @@ -1111,7 +1111,7 @@ uint16_t APIConnection::try_send_media_player_state(EntityBase *entity, APIConne | ||||
|   resp.state = static_cast<enums::MediaPlayerState>(report_state); | ||||
|   resp.volume = media_player->volume; | ||||
|   resp.muted = media_player->is_muted(); | ||||
|   resp.key = media_player->get_object_id_hash(); | ||||
|   fill_entity_state_base(media_player, resp); | ||||
|   return encode_message_to_buffer(resp, MediaPlayerStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
| void APIConnection::send_media_player_info(media_player::MediaPlayer *media_player) { | ||||
| @@ -1375,7 +1375,7 @@ uint16_t APIConnection::try_send_alarm_control_panel_state(EntityBase *entity, A | ||||
|   auto *a_alarm_control_panel = static_cast<alarm_control_panel::AlarmControlPanel *>(entity); | ||||
|   AlarmControlPanelStateResponse resp; | ||||
|   resp.state = static_cast<enums::AlarmControlPanelState>(a_alarm_control_panel->get_state()); | ||||
|   resp.key = a_alarm_control_panel->get_object_id_hash(); | ||||
|   fill_entity_state_base(a_alarm_control_panel, resp); | ||||
|   return encode_message_to_buffer(resp, AlarmControlPanelStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
| void APIConnection::send_alarm_control_panel_info(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel) { | ||||
| @@ -1439,7 +1439,7 @@ uint16_t APIConnection::try_send_event_response(event::Event *event, const std:: | ||||
|                                                 uint32_t remaining_size, bool is_single) { | ||||
|   EventResponse resp; | ||||
|   resp.event_type = event_type; | ||||
|   resp.key = event->get_object_id_hash(); | ||||
|   fill_entity_state_base(event, resp); | ||||
|   return encode_message_to_buffer(resp, EventResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
|  | ||||
| @@ -1477,7 +1477,7 @@ uint16_t APIConnection::try_send_update_state(EntityBase *entity, APIConnection | ||||
|     resp.release_summary = update->update_info.summary; | ||||
|     resp.release_url = update->update_info.release_url; | ||||
|   } | ||||
|   resp.key = update->get_object_id_hash(); | ||||
|   fill_entity_state_base(update, resp); | ||||
|   return encode_message_to_buffer(resp, UpdateStateResponse::MESSAGE_TYPE, conn, remaining_size, is_single); | ||||
| } | ||||
| void APIConnection::send_update_info(update::UpdateEntity *update) { | ||||
| @@ -1538,7 +1538,7 @@ bool APIConnection::try_send_log_message(int level, const char *tag, const char | ||||
|   buffer.encode_string(3, line, line_length);             // string message = 3 | ||||
|  | ||||
|   // SubscribeLogsResponse - 29 | ||||
|   return this->send_buffer(buffer, 29); | ||||
|   return this->send_buffer(buffer, SubscribeLogsResponse::MESSAGE_TYPE); | ||||
| } | ||||
|  | ||||
| HelloResponse APIConnection::hello(const HelloRequest &msg) { | ||||
| @@ -1685,7 +1685,7 @@ bool APIConnection::try_to_clear_buffer(bool log_out_of_space) { | ||||
|   return false; | ||||
| } | ||||
| bool APIConnection::send_buffer(ProtoWriteBuffer buffer, uint16_t message_type) { | ||||
|   if (!this->try_to_clear_buffer(message_type != 29)) {  // SubscribeLogsResponse | ||||
|   if (!this->try_to_clear_buffer(message_type != SubscribeLogsResponse::MESSAGE_TYPE)) {  // SubscribeLogsResponse | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -282,8 +282,8 @@ class APIConnection : public APIServerConnection { | ||||
|   ProtoWriteBuffer allocate_batch_message_buffer(uint16_t size); | ||||
|  | ||||
|  protected: | ||||
|   // Helper function to fill common entity fields | ||||
|   template<typename ResponseT> static void fill_entity_info_base(esphome::EntityBase *entity, ResponseT &response) { | ||||
|   // Helper function to fill common entity info fields | ||||
|   static void fill_entity_info_base(esphome::EntityBase *entity, InfoResponseProtoMessage &response) { | ||||
|     // Set common fields that are shared by all entity types | ||||
|     response.key = entity->get_object_id_hash(); | ||||
|     response.object_id = entity->get_object_id(); | ||||
| @@ -297,6 +297,11 @@ class APIConnection : public APIServerConnection { | ||||
|     response.entity_category = static_cast<enums::EntityCategory>(entity->get_entity_category()); | ||||
|   } | ||||
|  | ||||
|   // Helper function to fill common entity state fields | ||||
|   static void fill_entity_state_base(esphome::EntityBase *entity, StateResponseProtoMessage &response) { | ||||
|     response.key = entity->get_object_id_hash(); | ||||
|   } | ||||
|  | ||||
|   // Non-template helper to encode any ProtoMessage | ||||
|   static uint16_t encode_message_to_buffer(ProtoMessage &msg, uint16_t message_type, APIConnection *conn, | ||||
|                                            uint32_t remaining_size, bool is_single); | ||||
|   | ||||
| @@ -21,4 +21,5 @@ extend google.protobuf.MessageOptions { | ||||
|     optional string ifdef = 1038; | ||||
|     optional bool log = 1039 [default=true]; | ||||
|     optional bool no_delay = 1040 [default=false]; | ||||
|     optional string base_class = 1041; | ||||
| } | ||||
|   | ||||
| @@ -628,6 +628,7 @@ template<> const char *proto_enum_to_string<enums::UpdateCommand>(enums::UpdateC | ||||
|   } | ||||
| } | ||||
| #endif | ||||
|  | ||||
| bool HelloRequest::decode_varint(uint32_t field_id, ProtoVarInt value) { | ||||
|   switch (field_id) { | ||||
|     case 2: { | ||||
|   | ||||
| @@ -253,6 +253,27 @@ enum UpdateCommand : uint32_t { | ||||
|  | ||||
| }  // namespace enums | ||||
|  | ||||
| class InfoResponseProtoMessage : public ProtoMessage { | ||||
|  public: | ||||
|   virtual ~InfoResponseProtoMessage() = default; | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   std::string icon{}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|  | ||||
|  protected: | ||||
| }; | ||||
|  | ||||
| class StateResponseProtoMessage : public ProtoMessage { | ||||
|  public: | ||||
|   virtual ~StateResponseProtoMessage() = default; | ||||
|   uint32_t key{0}; | ||||
|  | ||||
|  protected: | ||||
| }; | ||||
| class HelloRequest : public ProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 1; | ||||
| @@ -484,22 +505,15 @@ class SubscribeStatesRequest : public ProtoMessage { | ||||
|  | ||||
|  protected: | ||||
| }; | ||||
| class ListEntitiesBinarySensorResponse : public ProtoMessage { | ||||
| class ListEntitiesBinarySensorResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 12; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 56; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_binary_sensor_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string device_class{}; | ||||
|   bool is_status_binary_sensor{false}; | ||||
|   bool disabled_by_default{false}; | ||||
|   std::string icon{}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
| @@ -511,14 +525,13 @@ class ListEntitiesBinarySensorResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class BinarySensorStateResponse : public ProtoMessage { | ||||
| class BinarySensorStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 21; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 9; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "binary_sensor_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   bool state{false}; | ||||
|   bool missing_state{false}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
| @@ -531,24 +544,17 @@ class BinarySensorStateResponse : public ProtoMessage { | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesCoverResponse : public ProtoMessage { | ||||
| class ListEntitiesCoverResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 13; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 62; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_cover_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   bool assumed_state{false}; | ||||
|   bool supports_position{false}; | ||||
|   bool supports_tilt{false}; | ||||
|   std::string device_class{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   std::string icon{}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   bool supports_stop{false}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| @@ -561,14 +567,13 @@ class ListEntitiesCoverResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class CoverStateResponse : public ProtoMessage { | ||||
| class CoverStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 22; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 19; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "cover_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   enums::LegacyCoverState legacy_state{}; | ||||
|   float position{0.0f}; | ||||
|   float tilt{0.0f}; | ||||
| @@ -608,24 +613,17 @@ class CoverCommandRequest : public ProtoMessage { | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesFanResponse : public ProtoMessage { | ||||
| class ListEntitiesFanResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 14; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 73; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_fan_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   bool supports_oscillation{false}; | ||||
|   bool supports_speed{false}; | ||||
|   bool supports_direction{false}; | ||||
|   int32_t supported_speed_count{0}; | ||||
|   bool disabled_by_default{false}; | ||||
|   std::string icon{}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   std::vector<std::string> supported_preset_modes{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| @@ -638,14 +636,13 @@ class ListEntitiesFanResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class FanStateResponse : public ProtoMessage { | ||||
| class FanStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 23; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 26; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "fan_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   bool state{false}; | ||||
|   bool oscillating{false}; | ||||
|   enums::FanSpeed speed{}; | ||||
| @@ -694,17 +691,13 @@ class FanCommandRequest : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesLightResponse : public ProtoMessage { | ||||
| class ListEntitiesLightResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 15; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 85; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_light_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::vector<enums::ColorMode> supported_color_modes{}; | ||||
|   bool legacy_supports_brightness{false}; | ||||
|   bool legacy_supports_rgb{false}; | ||||
| @@ -713,9 +706,6 @@ class ListEntitiesLightResponse : public ProtoMessage { | ||||
|   float min_mireds{0.0f}; | ||||
|   float max_mireds{0.0f}; | ||||
|   std::vector<std::string> effects{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   std::string icon{}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
| @@ -727,14 +717,13 @@ class ListEntitiesLightResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class LightStateResponse : public ProtoMessage { | ||||
| class LightStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 24; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 63; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "light_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   bool state{false}; | ||||
|   float brightness{0.0f}; | ||||
|   enums::ColorMode color_mode{}; | ||||
| @@ -803,26 +792,19 @@ class LightCommandRequest : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesSensorResponse : public ProtoMessage { | ||||
| class ListEntitiesSensorResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 16; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 73; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_sensor_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   std::string unit_of_measurement{}; | ||||
|   int32_t accuracy_decimals{0}; | ||||
|   bool force_update{false}; | ||||
|   std::string device_class{}; | ||||
|   enums::SensorStateClass state_class{}; | ||||
|   enums::SensorLastResetType legacy_last_reset_type{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
| @@ -834,14 +816,13 @@ class ListEntitiesSensorResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class SensorStateResponse : public ProtoMessage { | ||||
| class SensorStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 25; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 12; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "sensor_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   float state{0.0f}; | ||||
|   bool missing_state{false}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
| @@ -854,21 +835,14 @@ class SensorStateResponse : public ProtoMessage { | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesSwitchResponse : public ProtoMessage { | ||||
| class ListEntitiesSwitchResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 17; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 56; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_switch_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool assumed_state{false}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   std::string device_class{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| @@ -881,14 +855,13 @@ class ListEntitiesSwitchResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class SwitchStateResponse : public ProtoMessage { | ||||
| class SwitchStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 26; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 7; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "switch_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   bool state{false}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| @@ -919,20 +892,13 @@ class SwitchCommandRequest : public ProtoMessage { | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesTextSensorResponse : public ProtoMessage { | ||||
| class ListEntitiesTextSensorResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 18; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 54; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_text_sensor_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   std::string device_class{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| @@ -945,14 +911,13 @@ class ListEntitiesTextSensorResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class TextSensorStateResponse : public ProtoMessage { | ||||
| class TextSensorStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 27; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 16; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "text_sensor_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   std::string state{}; | ||||
|   bool missing_state{false}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
| @@ -1249,20 +1214,13 @@ class ExecuteServiceRequest : public ProtoMessage { | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
| }; | ||||
| class ListEntitiesCameraResponse : public ProtoMessage { | ||||
| class ListEntitiesCameraResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 43; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 45; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_camera_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   std::string icon{}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
| @@ -1313,17 +1271,13 @@ class CameraImageRequest : public ProtoMessage { | ||||
|  protected: | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesClimateResponse : public ProtoMessage { | ||||
| class ListEntitiesClimateResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 46; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 151; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_climate_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   bool supports_current_temperature{false}; | ||||
|   bool supports_two_point_target_temperature{false}; | ||||
|   std::vector<enums::ClimateMode> supported_modes{}; | ||||
| @@ -1337,9 +1291,6 @@ class ListEntitiesClimateResponse : public ProtoMessage { | ||||
|   std::vector<std::string> supported_custom_fan_modes{}; | ||||
|   std::vector<enums::ClimatePreset> supported_presets{}; | ||||
|   std::vector<std::string> supported_custom_presets{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   std::string icon{}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   float visual_current_temperature_step{0.0f}; | ||||
|   bool supports_current_humidity{false}; | ||||
|   bool supports_target_humidity{false}; | ||||
| @@ -1356,14 +1307,13 @@ class ListEntitiesClimateResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ClimateStateResponse : public ProtoMessage { | ||||
| class ClimateStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 47; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 65; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "climate_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   enums::ClimateMode mode{}; | ||||
|   float current_temperature{0.0f}; | ||||
|   float target_temperature{0.0f}; | ||||
| @@ -1430,23 +1380,16 @@ class ClimateCommandRequest : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesNumberResponse : public ProtoMessage { | ||||
| class ListEntitiesNumberResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 49; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 80; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_number_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   float min_value{0.0f}; | ||||
|   float max_value{0.0f}; | ||||
|   float step{0.0f}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   std::string unit_of_measurement{}; | ||||
|   enums::NumberMode mode{}; | ||||
|   std::string device_class{}; | ||||
| @@ -1461,14 +1404,13 @@ class ListEntitiesNumberResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class NumberStateResponse : public ProtoMessage { | ||||
| class NumberStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 50; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 12; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "number_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   float state{0.0f}; | ||||
|   bool missing_state{false}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
| @@ -1499,21 +1441,14 @@ class NumberCommandRequest : public ProtoMessage { | ||||
|  protected: | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
| }; | ||||
| class ListEntitiesSelectResponse : public ProtoMessage { | ||||
| class ListEntitiesSelectResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 52; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 63; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_select_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   std::vector<std::string> options{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
| @@ -1525,14 +1460,13 @@ class ListEntitiesSelectResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class SelectStateResponse : public ProtoMessage { | ||||
| class SelectStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 53; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 16; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "select_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   std::string state{}; | ||||
|   bool missing_state{false}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
| @@ -1565,23 +1499,16 @@ class SelectCommandRequest : public ProtoMessage { | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
| }; | ||||
| class ListEntitiesSirenResponse : public ProtoMessage { | ||||
| class ListEntitiesSirenResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 55; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 67; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_siren_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   std::vector<std::string> tones{}; | ||||
|   bool supports_duration{false}; | ||||
|   bool supports_volume{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
| @@ -1593,14 +1520,13 @@ class ListEntitiesSirenResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class SirenStateResponse : public ProtoMessage { | ||||
| class SirenStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 56; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 7; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "siren_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   bool state{false}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| @@ -1639,20 +1565,13 @@ class SirenCommandRequest : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesLockResponse : public ProtoMessage { | ||||
| class ListEntitiesLockResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 58; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 60; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_lock_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   bool assumed_state{false}; | ||||
|   bool supports_open{false}; | ||||
|   bool requires_code{false}; | ||||
| @@ -1668,14 +1587,13 @@ class ListEntitiesLockResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class LockStateResponse : public ProtoMessage { | ||||
| class LockStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 59; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 7; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "lock_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   enums::LockState state{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| @@ -1709,20 +1627,13 @@ class LockCommandRequest : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesButtonResponse : public ProtoMessage { | ||||
| class ListEntitiesButtonResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 61; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 54; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_button_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   std::string device_class{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| @@ -1769,20 +1680,13 @@ class MediaPlayerSupportedFormat : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesMediaPlayerResponse : public ProtoMessage { | ||||
| class ListEntitiesMediaPlayerResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 63; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 81; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_media_player_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   bool supports_pause{false}; | ||||
|   std::vector<MediaPlayerSupportedFormat> supported_formats{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
| @@ -1796,14 +1700,13 @@ class ListEntitiesMediaPlayerResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class MediaPlayerStateResponse : public ProtoMessage { | ||||
| class MediaPlayerStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 64; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 14; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "media_player_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   enums::MediaPlayerState state{}; | ||||
|   float volume{0.0f}; | ||||
|   bool muted{false}; | ||||
| @@ -2653,20 +2556,13 @@ class VoiceAssistantSetConfiguration : public ProtoMessage { | ||||
|  protected: | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
| }; | ||||
| class ListEntitiesAlarmControlPanelResponse : public ProtoMessage { | ||||
| class ListEntitiesAlarmControlPanelResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 94; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 53; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_alarm_control_panel_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   uint32_t supported_features{0}; | ||||
|   bool requires_code{false}; | ||||
|   bool requires_code_to_arm{false}; | ||||
| @@ -2681,14 +2577,13 @@ class ListEntitiesAlarmControlPanelResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class AlarmControlPanelStateResponse : public ProtoMessage { | ||||
| class AlarmControlPanelStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 95; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 7; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "alarm_control_panel_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   enums::AlarmControlPanelState state{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| @@ -2721,20 +2616,13 @@ class AlarmControlPanelCommandRequest : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesTextResponse : public ProtoMessage { | ||||
| class ListEntitiesTextResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 97; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 64; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_text_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   uint32_t min_length{0}; | ||||
|   uint32_t max_length{0}; | ||||
|   std::string pattern{}; | ||||
| @@ -2750,14 +2638,13 @@ class ListEntitiesTextResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class TextStateResponse : public ProtoMessage { | ||||
| class TextStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 98; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 16; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "text_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   std::string state{}; | ||||
|   bool missing_state{false}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
| @@ -2790,20 +2677,13 @@ class TextCommandRequest : public ProtoMessage { | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
| }; | ||||
| class ListEntitiesDateResponse : public ProtoMessage { | ||||
| class ListEntitiesDateResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 100; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 45; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_date_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
| @@ -2815,14 +2695,13 @@ class ListEntitiesDateResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class DateStateResponse : public ProtoMessage { | ||||
| class DateStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 101; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 19; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "date_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   bool missing_state{false}; | ||||
|   uint32_t year{0}; | ||||
|   uint32_t month{0}; | ||||
| @@ -2858,20 +2737,13 @@ class DateCommandRequest : public ProtoMessage { | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesTimeResponse : public ProtoMessage { | ||||
| class ListEntitiesTimeResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 103; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 45; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_time_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
| @@ -2883,14 +2755,13 @@ class ListEntitiesTimeResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class TimeStateResponse : public ProtoMessage { | ||||
| class TimeStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 104; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 19; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "time_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   bool missing_state{false}; | ||||
|   uint32_t hour{0}; | ||||
|   uint32_t minute{0}; | ||||
| @@ -2926,20 +2797,13 @@ class TimeCommandRequest : public ProtoMessage { | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesEventResponse : public ProtoMessage { | ||||
| class ListEntitiesEventResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 107; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 72; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_event_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   std::string device_class{}; | ||||
|   std::vector<std::string> event_types{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
| @@ -2953,14 +2817,13 @@ class ListEntitiesEventResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class EventResponse : public ProtoMessage { | ||||
| class EventResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 108; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 14; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "event_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   std::string event_type{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| @@ -2972,20 +2835,13 @@ class EventResponse : public ProtoMessage { | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
| }; | ||||
| class ListEntitiesValveResponse : public ProtoMessage { | ||||
| class ListEntitiesValveResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 109; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 60; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_valve_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   std::string device_class{}; | ||||
|   bool assumed_state{false}; | ||||
|   bool supports_position{false}; | ||||
| @@ -3001,14 +2857,13 @@ class ListEntitiesValveResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ValveStateResponse : public ProtoMessage { | ||||
| class ValveStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 110; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 12; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "valve_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   float position{0.0f}; | ||||
|   enums::ValveOperation current_operation{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
| @@ -3042,20 +2897,13 @@ class ValveCommandRequest : public ProtoMessage { | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class ListEntitiesDateTimeResponse : public ProtoMessage { | ||||
| class ListEntitiesDateTimeResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 112; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 45; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_date_time_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
| @@ -3067,14 +2915,13 @@ class ListEntitiesDateTimeResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class DateTimeStateResponse : public ProtoMessage { | ||||
| class DateTimeStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 113; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 12; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "date_time_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   bool missing_state{false}; | ||||
|   uint32_t epoch_seconds{0}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
| @@ -3105,20 +2952,13 @@ class DateTimeCommandRequest : public ProtoMessage { | ||||
|  protected: | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
| }; | ||||
| class ListEntitiesUpdateResponse : public ProtoMessage { | ||||
| class ListEntitiesUpdateResponse : public InfoResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 116; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 54; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "list_entities_update_response"; } | ||||
| #endif | ||||
|   std::string object_id{}; | ||||
|   uint32_t key{0}; | ||||
|   std::string name{}; | ||||
|   std::string unique_id{}; | ||||
|   std::string icon{}; | ||||
|   bool disabled_by_default{false}; | ||||
|   enums::EntityCategory entity_category{}; | ||||
|   std::string device_class{}; | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(uint32_t &total_size) const override; | ||||
| @@ -3131,14 +2971,13 @@ class ListEntitiesUpdateResponse : public ProtoMessage { | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||
| }; | ||||
| class UpdateStateResponse : public ProtoMessage { | ||||
| class UpdateStateResponse : public StateResponseProtoMessage { | ||||
|  public: | ||||
|   static constexpr uint16_t MESSAGE_TYPE = 117; | ||||
|   static constexpr uint16_t ESTIMATED_SIZE = 61; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   static constexpr const char *message_name() { return "update_state_response"; } | ||||
| #endif | ||||
|   uint32_t key{0}; | ||||
|   bool missing_state{false}; | ||||
|   bool in_progress{false}; | ||||
|   bool has_progress{false}; | ||||
|   | ||||
| @@ -11,7 +11,7 @@ import sys | ||||
| from textwrap import dedent | ||||
| from typing import Any | ||||
|  | ||||
| import aioesphomeapi.api_options_pb2 as pb | ||||
| import api_options_pb2 as pb | ||||
| import google.protobuf.descriptor_pb2 as descriptor | ||||
|  | ||||
|  | ||||
| @@ -848,7 +848,10 @@ def calculate_message_estimated_size(desc: descriptor.DescriptorProto) -> int: | ||||
|     return total_size | ||||
|  | ||||
|  | ||||
| def build_message_type(desc: descriptor.DescriptorProto) -> tuple[str, str]: | ||||
| def build_message_type( | ||||
|     desc: descriptor.DescriptorProto, | ||||
|     base_class_fields: dict[str, list[descriptor.FieldDescriptorProto]] = None, | ||||
| ) -> tuple[str, str]: | ||||
|     public_content: list[str] = [] | ||||
|     protected_content: list[str] = [] | ||||
|     decode_varint: list[str] = [] | ||||
| @@ -859,6 +862,12 @@ def build_message_type(desc: descriptor.DescriptorProto) -> tuple[str, str]: | ||||
|     dump: list[str] = [] | ||||
|     size_calc: list[str] = [] | ||||
|  | ||||
|     # Check if this message has a base class | ||||
|     base_class = get_base_class(desc) | ||||
|     common_field_names = set() | ||||
|     if base_class and base_class_fields and base_class in base_class_fields: | ||||
|         common_field_names = {f.name for f in base_class_fields[base_class]} | ||||
|  | ||||
|     # Get message ID if it's a service message | ||||
|     message_id: int | None = get_opt(desc, pb.id) | ||||
|  | ||||
| @@ -886,8 +895,14 @@ def build_message_type(desc: descriptor.DescriptorProto) -> tuple[str, str]: | ||||
|             ti = RepeatedTypeInfo(field) | ||||
|         else: | ||||
|             ti = TYPE_INFO[field.type](field) | ||||
|  | ||||
|         # Skip field declarations for fields that are in the base class | ||||
|         # but include their encode/decode logic | ||||
|         if field.name not in common_field_names: | ||||
|             protected_content.extend(ti.protected_content) | ||||
|             public_content.extend(ti.public_content) | ||||
|  | ||||
|         # Always include encode/decode logic for all fields | ||||
|         encode.append(ti.encode_content) | ||||
|         size_calc.append(ti.get_size_calculation(f"this->{ti.field_name}")) | ||||
|  | ||||
| @@ -1001,6 +1016,9 @@ def build_message_type(desc: descriptor.DescriptorProto) -> tuple[str, str]: | ||||
|     prot += "#endif\n" | ||||
|     public_content.append(prot) | ||||
|  | ||||
|     if base_class: | ||||
|         out = f"class {desc.name} : public {base_class} {{\n" | ||||
|     else: | ||||
|         out = f"class {desc.name} : public ProtoMessage {{\n" | ||||
|     out += " public:\n" | ||||
|     out += indent("\n".join(public_content)) + "\n" | ||||
| @@ -1033,6 +1051,132 @@ def get_opt( | ||||
|     return desc.options.Extensions[opt] | ||||
|  | ||||
|  | ||||
| def get_base_class(desc: descriptor.DescriptorProto) -> str | None: | ||||
|     """Get the base_class option from a message descriptor.""" | ||||
|     if not desc.options.HasExtension(pb.base_class): | ||||
|         return None | ||||
|     return desc.options.Extensions[pb.base_class] | ||||
|  | ||||
|  | ||||
| def collect_messages_by_base_class( | ||||
|     messages: list[descriptor.DescriptorProto], | ||||
| ) -> dict[str, list[descriptor.DescriptorProto]]: | ||||
|     """Group messages by their base_class option.""" | ||||
|     base_class_groups = {} | ||||
|  | ||||
|     for msg in messages: | ||||
|         base_class = get_base_class(msg) | ||||
|         if base_class: | ||||
|             if base_class not in base_class_groups: | ||||
|                 base_class_groups[base_class] = [] | ||||
|             base_class_groups[base_class].append(msg) | ||||
|  | ||||
|     return base_class_groups | ||||
|  | ||||
|  | ||||
| def find_common_fields( | ||||
|     messages: list[descriptor.DescriptorProto], | ||||
| ) -> list[descriptor.FieldDescriptorProto]: | ||||
|     """Find fields that are common to all messages in the list.""" | ||||
|     if not messages: | ||||
|         return [] | ||||
|  | ||||
|     # Start with fields from the first message | ||||
|     first_msg_fields = {field.name: field for field in messages[0].field} | ||||
|     common_fields = [] | ||||
|  | ||||
|     # Check each field to see if it exists in all messages with same type | ||||
|     # Field numbers can vary between messages - derived classes handle the mapping | ||||
|     for field_name, field in first_msg_fields.items(): | ||||
|         is_common = True | ||||
|  | ||||
|         for msg in messages[1:]: | ||||
|             found = False | ||||
|             for other_field in msg.field: | ||||
|                 if ( | ||||
|                     other_field.name == field_name | ||||
|                     and other_field.type == field.type | ||||
|                     and other_field.label == field.label | ||||
|                 ): | ||||
|                     found = True | ||||
|                     break | ||||
|  | ||||
|             if not found: | ||||
|                 is_common = False | ||||
|                 break | ||||
|  | ||||
|         if is_common: | ||||
|             common_fields.append(field) | ||||
|  | ||||
|     # Sort by field number to maintain order | ||||
|     common_fields.sort(key=lambda f: f.number) | ||||
|     return common_fields | ||||
|  | ||||
|  | ||||
| def build_base_class( | ||||
|     base_class_name: str, | ||||
|     common_fields: list[descriptor.FieldDescriptorProto], | ||||
| ) -> tuple[str, str]: | ||||
|     """Build the base class definition and implementation.""" | ||||
|     public_content = [] | ||||
|     protected_content = [] | ||||
|  | ||||
|     # For base classes, we only declare the fields but don't handle encode/decode | ||||
|     # The derived classes will handle encoding/decoding with their specific field numbers | ||||
|     for field in common_fields: | ||||
|         if field.label == 3:  # repeated | ||||
|             ti = RepeatedTypeInfo(field) | ||||
|         else: | ||||
|             ti = TYPE_INFO[field.type](field) | ||||
|  | ||||
|         # Only add field declarations, not encode/decode logic | ||||
|         protected_content.extend(ti.protected_content) | ||||
|         public_content.extend(ti.public_content) | ||||
|  | ||||
|     # Build header | ||||
|     out = f"class {base_class_name} : public ProtoMessage {{\n" | ||||
|     out += " public:\n" | ||||
|  | ||||
|     # Add virtual destructor | ||||
|     public_content.insert(0, f"virtual ~{base_class_name}() = default;") | ||||
|  | ||||
|     # Base classes don't implement encode/decode/calculate_size | ||||
|     # Derived classes handle these with their specific field numbers | ||||
|     cpp = "" | ||||
|  | ||||
|     out += indent("\n".join(public_content)) + "\n" | ||||
|     out += "\n" | ||||
|     out += " protected:\n" | ||||
|     out += indent("\n".join(protected_content)) | ||||
|     if protected_content: | ||||
|         out += "\n" | ||||
|     out += "};\n" | ||||
|  | ||||
|     # No implementation needed for base classes | ||||
|  | ||||
|     return out, cpp | ||||
|  | ||||
|  | ||||
| def generate_base_classes( | ||||
|     base_class_groups: dict[str, list[descriptor.DescriptorProto]], | ||||
| ) -> tuple[str, str]: | ||||
|     """Generate all base classes.""" | ||||
|     all_headers = [] | ||||
|     all_cpp = [] | ||||
|  | ||||
|     for base_class_name, messages in base_class_groups.items(): | ||||
|         # Find common fields | ||||
|         common_fields = find_common_fields(messages) | ||||
|  | ||||
|         if common_fields: | ||||
|             # Generate base class | ||||
|             header, cpp = build_base_class(base_class_name, common_fields) | ||||
|             all_headers.append(header) | ||||
|             all_cpp.append(cpp) | ||||
|  | ||||
|     return "\n".join(all_headers), "\n".join(all_cpp) | ||||
|  | ||||
|  | ||||
| def build_service_message_type( | ||||
|     mt: descriptor.DescriptorProto, | ||||
| ) -> tuple[str, str] | None: | ||||
| @@ -1134,8 +1278,25 @@ def main() -> None: | ||||
|  | ||||
|     mt = file.message_type | ||||
|  | ||||
|     # Collect messages by base class | ||||
|     base_class_groups = collect_messages_by_base_class(mt) | ||||
|  | ||||
|     # Find common fields for each base class | ||||
|     base_class_fields = {} | ||||
|     for base_class_name, messages in base_class_groups.items(): | ||||
|         common_fields = find_common_fields(messages) | ||||
|         if common_fields: | ||||
|             base_class_fields[base_class_name] = common_fields | ||||
|  | ||||
|     # Generate base classes | ||||
|     if base_class_fields: | ||||
|         base_headers, base_cpp = generate_base_classes(base_class_groups) | ||||
|         content += base_headers | ||||
|         cpp += base_cpp | ||||
|  | ||||
|     # Generate message types with base class information | ||||
|     for m in mt: | ||||
|         s, c = build_message_type(m) | ||||
|         s, c = build_message_type(m, base_class_fields) | ||||
|         content += s | ||||
|         cpp += c | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user