diff --git a/esphome/components/api/api.proto b/esphome/components/api/api.proto index c0bbbaaeab..b9b56d3f8e 100644 --- a/esphome/components/api/api.proto +++ b/esphome/components/api/api.proto @@ -214,6 +214,7 @@ message ListEntitiesBinarySensorResponse { string device_class = 5; bool is_status_binary_sensor = 6; + bool disabled_by_default = 7; } message BinarySensorStateResponse { option (id) = 21; @@ -243,6 +244,7 @@ message ListEntitiesCoverResponse { bool supports_position = 6; bool supports_tilt = 7; string device_class = 8; + bool disabled_by_default = 9; } enum LegacyCoverState { @@ -310,6 +312,7 @@ message ListEntitiesFanResponse { bool supports_speed = 6; bool supports_direction = 7; int32 supported_speed_count = 8; + bool disabled_by_default = 9; } enum FanSpeed { FAN_SPEED_LOW = 0; @@ -384,6 +387,7 @@ message ListEntitiesLightResponse { float min_mireds = 9; float max_mireds = 10; repeated string effects = 11; + bool disabled_by_default = 13; } message LightStateResponse { option (id) = 24; @@ -469,6 +473,7 @@ message ListEntitiesSensorResponse { string device_class = 9; SensorStateClass state_class = 10; SensorLastResetType last_reset_type = 11; + bool disabled_by_default = 12; } message SensorStateResponse { option (id) = 25; @@ -496,6 +501,7 @@ message ListEntitiesSwitchResponse { string icon = 5; bool assumed_state = 6; + bool disabled_by_default = 7; } message SwitchStateResponse { option (id) = 26; @@ -528,6 +534,7 @@ message ListEntitiesTextSensorResponse { string unique_id = 4; string icon = 5; + bool disabled_by_default = 6; } message TextSensorStateResponse { option (id) = 27; @@ -687,6 +694,7 @@ message ListEntitiesCameraResponse { fixed32 key = 2; string name = 3; string unique_id = 4; + bool disabled_by_default = 5; } message CameraImageResponse { @@ -779,6 +787,7 @@ message ListEntitiesClimateResponse { repeated string supported_custom_fan_modes = 15; repeated ClimatePreset supported_presets = 16; repeated string supported_custom_presets = 17; + bool disabled_by_default = 18; } message ClimateStateResponse { option (id) = 47; @@ -846,6 +855,7 @@ message ListEntitiesNumberResponse { float min_value = 6; float max_value = 7; float step = 8; + bool disabled_by_default = 9; } message NumberStateResponse { option (id) = 50; @@ -882,6 +892,7 @@ message ListEntitiesSelectResponse { string icon = 5; repeated string options = 6; + bool disabled_by_default = 7; } message SelectStateResponse { option (id) = 53; diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index 94522a13be..5fba549a57 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -176,6 +176,7 @@ bool APIConnection::send_binary_sensor_info(binary_sensor::BinarySensor *binary_ msg.unique_id = get_default_unique_id("binary_sensor", binary_sensor); msg.device_class = binary_sensor->get_device_class(); msg.is_status_binary_sensor = binary_sensor->is_status_binary_sensor(); + msg.disabled_by_default = binary_sensor->is_disabled_by_default(); return this->send_list_entities_binary_sensor_response(msg); } #endif @@ -207,6 +208,7 @@ bool APIConnection::send_cover_info(cover::Cover *cover) { msg.supports_position = traits.get_supports_position(); msg.supports_tilt = traits.get_supports_tilt(); msg.device_class = cover->get_device_class(); + msg.disabled_by_default = cover->is_disabled_by_default(); return this->send_list_entities_cover_response(msg); } void APIConnection::cover_command(const CoverCommandRequest &msg) { @@ -268,6 +270,7 @@ bool APIConnection::send_fan_info(fan::FanState *fan) { msg.supports_speed = traits.supports_speed(); msg.supports_direction = traits.supports_direction(); msg.supported_speed_count = traits.supported_speed_count(); + msg.disabled_by_default = fan->is_disabled_by_default(); return this->send_list_entities_fan_response(msg); } void APIConnection::fan_command(const FanCommandRequest &msg) { @@ -334,6 +337,9 @@ bool APIConnection::send_light_info(light::LightState *light) { msg.object_id = light->get_object_id(); msg.name = light->get_name(); msg.unique_id = get_default_unique_id("light", light); + + msg.disabled_by_default = light->is_disabled_by_default(); + for (auto mode : traits.get_supported_color_modes()) msg.supported_color_modes.push_back(static_cast(mode)); @@ -419,6 +425,7 @@ bool APIConnection::send_sensor_info(sensor::Sensor *sensor) { msg.device_class = sensor->get_device_class(); msg.state_class = static_cast(sensor->state_class); msg.last_reset_type = static_cast(sensor->last_reset_type); + msg.disabled_by_default = sensor->is_disabled_by_default(); return this->send_list_entities_sensor_response(msg); } @@ -442,6 +449,7 @@ bool APIConnection::send_switch_info(switch_::Switch *a_switch) { msg.unique_id = get_default_unique_id("switch", a_switch); msg.icon = a_switch->get_icon(); msg.assumed_state = a_switch->assumed_state(); + msg.disabled_by_default = a_switch->is_disabled_by_default(); return this->send_list_entities_switch_response(msg); } void APIConnection::switch_command(const SwitchCommandRequest &msg) { @@ -476,6 +484,7 @@ bool APIConnection::send_text_sensor_info(text_sensor::TextSensor *text_sensor) if (msg.unique_id.empty()) msg.unique_id = get_default_unique_id("text_sensor", text_sensor); msg.icon = text_sensor->get_icon(); + msg.disabled_by_default = text_sensor->is_disabled_by_default(); return this->send_list_entities_text_sensor_response(msg); } #endif @@ -519,6 +528,9 @@ bool APIConnection::send_climate_info(climate::Climate *climate) { msg.object_id = climate->get_object_id(); msg.name = climate->get_name(); msg.unique_id = get_default_unique_id("climate", climate); + + msg.disabled_by_default = climate->is_disabled_by_default(); + msg.supports_current_temperature = traits.get_supports_current_temperature(); msg.supports_two_point_target_temperature = traits.get_supports_two_point_target_temperature(); @@ -591,6 +603,7 @@ bool APIConnection::send_number_info(number::Number *number) { msg.name = number->get_name(); msg.unique_id = get_default_unique_id("number", number); msg.icon = number->traits.get_icon(); + msg.disabled_by_default = number->is_disabled_by_default(); msg.min_value = number->traits.get_min_value(); msg.max_value = number->traits.get_max_value(); @@ -627,6 +640,7 @@ bool APIConnection::send_select_info(select::Select *select) { msg.name = select->get_name(); msg.unique_id = get_default_unique_id("select", select); msg.icon = select->traits.get_icon(); + msg.disabled_by_default = select->is_disabled_by_default(); for (const auto &option : select->traits.get_options()) msg.options.push_back(option); @@ -658,6 +672,7 @@ bool APIConnection::send_camera_info(esp32_camera::ESP32Camera *camera) { msg.object_id = camera->get_object_id(); msg.name = camera->get_name(); msg.unique_id = get_default_unique_id("camera", camera); + msg.disabled_by_default = camera->is_disabled_by_default(); return this->send_list_entities_camera_response(msg); } void APIConnection::camera_image(const CameraImageRequest &msg) { diff --git a/esphome/components/api/api_pb2.cpp b/esphome/components/api/api_pb2.cpp index 65fe16d6e0..eecba7a68e 100644 --- a/esphome/components/api/api_pb2.cpp +++ b/esphome/components/api/api_pb2.cpp @@ -501,6 +501,10 @@ bool ListEntitiesBinarySensorResponse::decode_varint(uint32_t field_id, ProtoVar this->is_status_binary_sensor = value.as_bool(); return true; } + case 7: { + this->disabled_by_default = value.as_bool(); + return true; + } default: return false; } @@ -544,6 +548,7 @@ void ListEntitiesBinarySensorResponse::encode(ProtoWriteBuffer buffer) const { buffer.encode_string(4, this->unique_id); buffer.encode_string(5, this->device_class); buffer.encode_bool(6, this->is_status_binary_sensor); + buffer.encode_bool(7, this->disabled_by_default); } #ifdef HAS_PROTO_MESSAGE_DUMP void ListEntitiesBinarySensorResponse::dump_to(std::string &out) const { @@ -573,6 +578,10 @@ void ListEntitiesBinarySensorResponse::dump_to(std::string &out) const { out.append(" is_status_binary_sensor: "); out.append(YESNO(this->is_status_binary_sensor)); out.append("\n"); + + out.append(" disabled_by_default: "); + out.append(YESNO(this->disabled_by_default)); + out.append("\n"); out.append("}"); } #endif @@ -638,6 +647,10 @@ bool ListEntitiesCoverResponse::decode_varint(uint32_t field_id, ProtoVarInt val this->supports_tilt = value.as_bool(); return true; } + case 9: { + this->disabled_by_default = value.as_bool(); + return true; + } default: return false; } @@ -683,6 +696,7 @@ void ListEntitiesCoverResponse::encode(ProtoWriteBuffer buffer) const { buffer.encode_bool(6, this->supports_position); buffer.encode_bool(7, this->supports_tilt); buffer.encode_string(8, this->device_class); + buffer.encode_bool(9, this->disabled_by_default); } #ifdef HAS_PROTO_MESSAGE_DUMP void ListEntitiesCoverResponse::dump_to(std::string &out) const { @@ -720,6 +734,10 @@ void ListEntitiesCoverResponse::dump_to(std::string &out) const { out.append(" device_class: "); out.append("'").append(this->device_class).append("'"); out.append("\n"); + + out.append(" disabled_by_default: "); + out.append(YESNO(this->disabled_by_default)); + out.append("\n"); out.append("}"); } #endif @@ -904,6 +922,10 @@ bool ListEntitiesFanResponse::decode_varint(uint32_t field_id, ProtoVarInt value this->supported_speed_count = value.as_int32(); return true; } + case 9: { + this->disabled_by_default = value.as_bool(); + return true; + } default: return false; } @@ -945,6 +967,7 @@ void ListEntitiesFanResponse::encode(ProtoWriteBuffer buffer) const { buffer.encode_bool(6, this->supports_speed); buffer.encode_bool(7, this->supports_direction); buffer.encode_int32(8, this->supported_speed_count); + buffer.encode_bool(9, this->disabled_by_default); } #ifdef HAS_PROTO_MESSAGE_DUMP void ListEntitiesFanResponse::dump_to(std::string &out) const { @@ -983,6 +1006,10 @@ void ListEntitiesFanResponse::dump_to(std::string &out) const { sprintf(buffer, "%d", this->supported_speed_count); out.append(buffer); out.append("\n"); + + out.append(" disabled_by_default: "); + out.append(YESNO(this->disabled_by_default)); + out.append("\n"); out.append("}"); } #endif @@ -1205,6 +1232,10 @@ bool ListEntitiesLightResponse::decode_varint(uint32_t field_id, ProtoVarInt val this->legacy_supports_color_temperature = value.as_bool(); return true; } + case 13: { + this->disabled_by_default = value.as_bool(); + return true; + } default: return false; } @@ -1266,6 +1297,7 @@ void ListEntitiesLightResponse::encode(ProtoWriteBuffer buffer) const { for (auto &it : this->effects) { buffer.encode_string(11, it, true); } + buffer.encode_bool(13, this->disabled_by_default); } #ifdef HAS_PROTO_MESSAGE_DUMP void ListEntitiesLightResponse::dump_to(std::string &out) const { @@ -1325,6 +1357,10 @@ void ListEntitiesLightResponse::dump_to(std::string &out) const { out.append("'").append(it).append("'"); out.append("\n"); } + + out.append(" disabled_by_default: "); + out.append(YESNO(this->disabled_by_default)); + out.append("\n"); out.append("}"); } #endif @@ -1780,6 +1816,10 @@ bool ListEntitiesSensorResponse::decode_varint(uint32_t field_id, ProtoVarInt va this->last_reset_type = value.as_enum(); return true; } + case 12: { + this->disabled_by_default = value.as_bool(); + return true; + } default: return false; } @@ -1836,6 +1876,7 @@ void ListEntitiesSensorResponse::encode(ProtoWriteBuffer buffer) const { buffer.encode_string(9, this->device_class); buffer.encode_enum(10, this->state_class); buffer.encode_enum(11, this->last_reset_type); + buffer.encode_bool(12, this->disabled_by_default); } #ifdef HAS_PROTO_MESSAGE_DUMP void ListEntitiesSensorResponse::dump_to(std::string &out) const { @@ -1886,6 +1927,10 @@ void ListEntitiesSensorResponse::dump_to(std::string &out) const { out.append(" last_reset_type: "); out.append(proto_enum_to_string(this->last_reset_type)); out.append("\n"); + + out.append(" disabled_by_default: "); + out.append(YESNO(this->disabled_by_default)); + out.append("\n"); out.append("}"); } #endif @@ -1944,6 +1989,10 @@ bool ListEntitiesSwitchResponse::decode_varint(uint32_t field_id, ProtoVarInt va this->assumed_state = value.as_bool(); return true; } + case 7: { + this->disabled_by_default = value.as_bool(); + return true; + } default: return false; } @@ -1987,6 +2036,7 @@ void ListEntitiesSwitchResponse::encode(ProtoWriteBuffer buffer) const { buffer.encode_string(4, this->unique_id); buffer.encode_string(5, this->icon); buffer.encode_bool(6, this->assumed_state); + buffer.encode_bool(7, this->disabled_by_default); } #ifdef HAS_PROTO_MESSAGE_DUMP void ListEntitiesSwitchResponse::dump_to(std::string &out) const { @@ -2016,6 +2066,10 @@ void ListEntitiesSwitchResponse::dump_to(std::string &out) const { out.append(" assumed_state: "); out.append(YESNO(this->assumed_state)); out.append("\n"); + + out.append(" disabled_by_default: "); + out.append(YESNO(this->disabled_by_default)); + out.append("\n"); out.append("}"); } #endif @@ -2097,6 +2151,16 @@ void SwitchCommandRequest::dump_to(std::string &out) const { out.append("}"); } #endif +bool ListEntitiesTextSensorResponse::decode_varint(uint32_t field_id, ProtoVarInt value) { + switch (field_id) { + case 6: { + this->disabled_by_default = value.as_bool(); + return true; + } + default: + return false; + } +} bool ListEntitiesTextSensorResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) { switch (field_id) { case 1: { @@ -2135,6 +2199,7 @@ void ListEntitiesTextSensorResponse::encode(ProtoWriteBuffer buffer) const { buffer.encode_string(3, this->name); buffer.encode_string(4, this->unique_id); buffer.encode_string(5, this->icon); + buffer.encode_bool(6, this->disabled_by_default); } #ifdef HAS_PROTO_MESSAGE_DUMP void ListEntitiesTextSensorResponse::dump_to(std::string &out) const { @@ -2160,6 +2225,10 @@ void ListEntitiesTextSensorResponse::dump_to(std::string &out) const { out.append(" icon: "); out.append("'").append(this->icon).append("'"); out.append("\n"); + + out.append(" disabled_by_default: "); + out.append(YESNO(this->disabled_by_default)); + out.append("\n"); out.append("}"); } #endif @@ -2786,6 +2855,16 @@ void ExecuteServiceRequest::dump_to(std::string &out) const { out.append("}"); } #endif +bool ListEntitiesCameraResponse::decode_varint(uint32_t field_id, ProtoVarInt value) { + switch (field_id) { + case 5: { + this->disabled_by_default = value.as_bool(); + return true; + } + default: + return false; + } +} bool ListEntitiesCameraResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) { switch (field_id) { case 1: { @@ -2819,6 +2898,7 @@ void ListEntitiesCameraResponse::encode(ProtoWriteBuffer buffer) const { buffer.encode_fixed32(2, this->key); buffer.encode_string(3, this->name); buffer.encode_string(4, this->unique_id); + buffer.encode_bool(5, this->disabled_by_default); } #ifdef HAS_PROTO_MESSAGE_DUMP void ListEntitiesCameraResponse::dump_to(std::string &out) const { @@ -2840,6 +2920,10 @@ void ListEntitiesCameraResponse::dump_to(std::string &out) const { out.append(" unique_id: "); out.append("'").append(this->unique_id).append("'"); out.append("\n"); + + out.append(" disabled_by_default: "); + out.append(YESNO(this->disabled_by_default)); + out.append("\n"); out.append("}"); } #endif @@ -2963,6 +3047,10 @@ bool ListEntitiesClimateResponse::decode_varint(uint32_t field_id, ProtoVarInt v this->supported_presets.push_back(value.as_enum()); return true; } + case 18: { + this->disabled_by_default = value.as_bool(); + return true; + } default: return false; } @@ -3045,6 +3133,7 @@ void ListEntitiesClimateResponse::encode(ProtoWriteBuffer buffer) const { for (auto &it : this->supported_custom_presets) { buffer.encode_string(17, it, true); } + buffer.encode_bool(18, this->disabled_by_default); } #ifdef HAS_PROTO_MESSAGE_DUMP void ListEntitiesClimateResponse::dump_to(std::string &out) const { @@ -3133,6 +3222,10 @@ void ListEntitiesClimateResponse::dump_to(std::string &out) const { out.append("'").append(it).append("'"); out.append("\n"); } + + out.append(" disabled_by_default: "); + out.append(YESNO(this->disabled_by_default)); + out.append("\n"); out.append("}"); } #endif @@ -3503,6 +3596,16 @@ void ClimateCommandRequest::dump_to(std::string &out) const { out.append("}"); } #endif +bool ListEntitiesNumberResponse::decode_varint(uint32_t field_id, ProtoVarInt value) { + switch (field_id) { + case 9: { + this->disabled_by_default = value.as_bool(); + return true; + } + default: + return false; + } +} bool ListEntitiesNumberResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) { switch (field_id) { case 1: { @@ -3556,6 +3659,7 @@ void ListEntitiesNumberResponse::encode(ProtoWriteBuffer buffer) const { buffer.encode_float(6, this->min_value); buffer.encode_float(7, this->max_value); buffer.encode_float(8, this->step); + buffer.encode_bool(9, this->disabled_by_default); } #ifdef HAS_PROTO_MESSAGE_DUMP void ListEntitiesNumberResponse::dump_to(std::string &out) const { @@ -3596,6 +3700,10 @@ void ListEntitiesNumberResponse::dump_to(std::string &out) const { sprintf(buffer, "%g", this->step); out.append(buffer); out.append("\n"); + + out.append(" disabled_by_default: "); + out.append(YESNO(this->disabled_by_default)); + out.append("\n"); out.append("}"); } #endif @@ -3682,6 +3790,16 @@ void NumberCommandRequest::dump_to(std::string &out) const { out.append("}"); } #endif +bool ListEntitiesSelectResponse::decode_varint(uint32_t field_id, ProtoVarInt value) { + switch (field_id) { + case 7: { + this->disabled_by_default = value.as_bool(); + return true; + } + default: + return false; + } +} bool ListEntitiesSelectResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) { switch (field_id) { case 1: { @@ -3727,6 +3845,7 @@ void ListEntitiesSelectResponse::encode(ProtoWriteBuffer buffer) const { for (auto &it : this->options) { buffer.encode_string(6, it, true); } + buffer.encode_bool(7, this->disabled_by_default); } #ifdef HAS_PROTO_MESSAGE_DUMP void ListEntitiesSelectResponse::dump_to(std::string &out) const { @@ -3758,6 +3877,10 @@ void ListEntitiesSelectResponse::dump_to(std::string &out) const { out.append("'").append(it).append("'"); out.append("\n"); } + + out.append(" disabled_by_default: "); + out.append(YESNO(this->disabled_by_default)); + out.append("\n"); out.append("}"); } #endif diff --git a/esphome/components/api/api_pb2.h b/esphome/components/api/api_pb2.h index 9849f05a98..be32488391 100644 --- a/esphome/components/api/api_pb2.h +++ b/esphome/components/api/api_pb2.h @@ -266,6 +266,7 @@ class ListEntitiesBinarySensorResponse : public ProtoMessage { std::string unique_id{}; std::string device_class{}; bool is_status_binary_sensor{false}; + bool disabled_by_default{false}; void encode(ProtoWriteBuffer buffer) const override; #ifdef HAS_PROTO_MESSAGE_DUMP void dump_to(std::string &out) const override; @@ -300,6 +301,7 @@ class ListEntitiesCoverResponse : public ProtoMessage { bool supports_position{false}; bool supports_tilt{false}; std::string device_class{}; + bool disabled_by_default{false}; void encode(ProtoWriteBuffer buffer) const override; #ifdef HAS_PROTO_MESSAGE_DUMP void dump_to(std::string &out) const override; @@ -355,6 +357,7 @@ class ListEntitiesFanResponse : public ProtoMessage { bool supports_speed{false}; bool supports_direction{false}; int32_t supported_speed_count{0}; + bool disabled_by_default{false}; void encode(ProtoWriteBuffer buffer) const override; #ifdef HAS_PROTO_MESSAGE_DUMP void dump_to(std::string &out) const override; @@ -418,6 +421,7 @@ class ListEntitiesLightResponse : public ProtoMessage { float min_mireds{0.0f}; float max_mireds{0.0f}; std::vector effects{}; + bool disabled_by_default{false}; void encode(ProtoWriteBuffer buffer) const override; #ifdef HAS_PROTO_MESSAGE_DUMP void dump_to(std::string &out) const override; @@ -505,6 +509,7 @@ class ListEntitiesSensorResponse : public ProtoMessage { std::string device_class{}; enums::SensorStateClass state_class{}; enums::SensorLastResetType last_reset_type{}; + bool disabled_by_default{false}; void encode(ProtoWriteBuffer buffer) const override; #ifdef HAS_PROTO_MESSAGE_DUMP void dump_to(std::string &out) const override; @@ -537,6 +542,7 @@ class ListEntitiesSwitchResponse : public ProtoMessage { std::string unique_id{}; std::string icon{}; bool assumed_state{false}; + bool disabled_by_default{false}; void encode(ProtoWriteBuffer buffer) const override; #ifdef HAS_PROTO_MESSAGE_DUMP void dump_to(std::string &out) const override; @@ -580,6 +586,7 @@ class ListEntitiesTextSensorResponse : public ProtoMessage { std::string name{}; std::string unique_id{}; std::string icon{}; + bool disabled_by_default{false}; void encode(ProtoWriteBuffer buffer) const override; #ifdef HAS_PROTO_MESSAGE_DUMP void dump_to(std::string &out) const override; @@ -588,6 +595,7 @@ class ListEntitiesTextSensorResponse : public ProtoMessage { protected: bool decode_32bit(uint32_t field_id, Proto32Bit value) override; bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; + bool decode_varint(uint32_t field_id, ProtoVarInt value) override; }; class TextSensorStateResponse : public ProtoMessage { public: @@ -789,6 +797,7 @@ class ListEntitiesCameraResponse : public ProtoMessage { uint32_t key{0}; std::string name{}; std::string unique_id{}; + bool disabled_by_default{false}; void encode(ProtoWriteBuffer buffer) const override; #ifdef HAS_PROTO_MESSAGE_DUMP void dump_to(std::string &out) const override; @@ -797,6 +806,7 @@ class ListEntitiesCameraResponse : public ProtoMessage { protected: bool decode_32bit(uint32_t field_id, Proto32Bit value) override; bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; + bool decode_varint(uint32_t field_id, ProtoVarInt value) override; }; class CameraImageResponse : public ProtoMessage { public: @@ -844,6 +854,7 @@ class ListEntitiesClimateResponse : public ProtoMessage { std::vector supported_custom_fan_modes{}; std::vector supported_presets{}; std::vector supported_custom_presets{}; + bool disabled_by_default{false}; void encode(ProtoWriteBuffer buffer) const override; #ifdef HAS_PROTO_MESSAGE_DUMP void dump_to(std::string &out) const override; @@ -922,6 +933,7 @@ class ListEntitiesNumberResponse : public ProtoMessage { float min_value{0.0f}; float max_value{0.0f}; float step{0.0f}; + bool disabled_by_default{false}; void encode(ProtoWriteBuffer buffer) const override; #ifdef HAS_PROTO_MESSAGE_DUMP void dump_to(std::string &out) const override; @@ -930,6 +942,7 @@ class ListEntitiesNumberResponse : public ProtoMessage { protected: bool decode_32bit(uint32_t field_id, Proto32Bit value) override; bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; + bool decode_varint(uint32_t field_id, ProtoVarInt value) override; }; class NumberStateResponse : public ProtoMessage { public: @@ -965,6 +978,7 @@ class ListEntitiesSelectResponse : public ProtoMessage { std::string unique_id{}; std::string icon{}; std::vector options{}; + bool disabled_by_default{false}; void encode(ProtoWriteBuffer buffer) const override; #ifdef HAS_PROTO_MESSAGE_DUMP void dump_to(std::string &out) const override; @@ -973,6 +987,7 @@ class ListEntitiesSelectResponse : public ProtoMessage { protected: bool decode_32bit(uint32_t field_id, Proto32Bit value) override; bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; + bool decode_varint(uint32_t field_id, ProtoVarInt value) override; }; class SelectStateResponse : public ProtoMessage { public: diff --git a/esphome/components/binary_sensor/__init__.py b/esphome/components/binary_sensor/__init__.py index 8f66978320..3c2169a922 100644 --- a/esphome/components/binary_sensor/__init__.py +++ b/esphome/components/binary_sensor/__init__.py @@ -6,6 +6,7 @@ from esphome.components import mqtt from esphome.const import ( CONF_DELAY, CONF_DEVICE_CLASS, + CONF_DISABLED_BY_DEFAULT, CONF_FILTERS, CONF_ID, CONF_INTERNAL, @@ -315,7 +316,7 @@ def validate_multi_click_timing(value): device_class = cv.one_of(*DEVICE_CLASSES, lower=True, space="_") -BINARY_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend( +BINARY_SENSOR_SCHEMA = cv.NAMEABLE_SCHEMA.extend(cv.MQTT_COMPONENT_SCHEMA).extend( { cv.GenerateID(): cv.declare_id(BinarySensor), cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id( @@ -377,6 +378,7 @@ BINARY_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend( async def setup_binary_sensor_core_(var, config): cg.add(var.set_name(config[CONF_NAME])) + cg.add(var.set_disabled_by_default(config[CONF_DISABLED_BY_DEFAULT])) if CONF_INTERNAL in config: cg.add(var.set_internal(config[CONF_INTERNAL])) if CONF_DEVICE_CLASS in config: diff --git a/esphome/components/climate/__init__.py b/esphome/components/climate/__init__.py index 88991ff795..f6a9fa2927 100644 --- a/esphome/components/climate/__init__.py +++ b/esphome/components/climate/__init__.py @@ -6,6 +6,7 @@ from esphome.const import ( CONF_AWAY, CONF_CUSTOM_FAN_MODE, CONF_CUSTOM_PRESET, + CONF_DISABLED_BY_DEFAULT, CONF_ID, CONF_INTERNAL, CONF_MAX_TEMPERATURE, @@ -86,7 +87,7 @@ validate_climate_swing_mode = cv.enum(CLIMATE_SWING_MODES, upper=True) # Actions ControlAction = climate_ns.class_("ControlAction", automation.Action) -CLIMATE_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend( +CLIMATE_SCHEMA = cv.NAMEABLE_SCHEMA.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA).extend( { cv.GenerateID(): cv.declare_id(Climate), cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTClimateComponent), @@ -104,6 +105,7 @@ CLIMATE_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend( async def setup_climate_core_(var, config): cg.add(var.set_name(config[CONF_NAME])) + cg.add(var.set_disabled_by_default(config[CONF_DISABLED_BY_DEFAULT])) if CONF_INTERNAL in config: cg.add(var.set_internal(config[CONF_INTERNAL])) visual = config[CONF_VISUAL] diff --git a/esphome/components/cover/__init__.py b/esphome/components/cover/__init__.py index 4a7266303d..6fd6ac81b0 100644 --- a/esphome/components/cover/__init__.py +++ b/esphome/components/cover/__init__.py @@ -4,6 +4,7 @@ from esphome import automation from esphome.automation import maybe_simple_id, Condition from esphome.components import mqtt from esphome.const import ( + CONF_DISABLED_BY_DEFAULT, CONF_ID, CONF_INTERNAL, CONF_DEVICE_CLASS, @@ -63,7 +64,7 @@ CoverPublishAction = cover_ns.class_("CoverPublishAction", automation.Action) CoverIsOpenCondition = cover_ns.class_("CoverIsOpenCondition", Condition) CoverIsClosedCondition = cover_ns.class_("CoverIsClosedCondition", Condition) -COVER_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend( +COVER_SCHEMA = cv.NAMEABLE_SCHEMA.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA).extend( { cv.GenerateID(): cv.declare_id(Cover), cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTCoverComponent), @@ -75,6 +76,7 @@ COVER_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend( async def setup_cover_core_(var, config): cg.add(var.set_name(config[CONF_NAME])) + cg.add(var.set_disabled_by_default(config[CONF_DISABLED_BY_DEFAULT])) if CONF_INTERNAL in config: cg.add(var.set_internal(config[CONF_INTERNAL])) if CONF_DEVICE_CLASS in config: diff --git a/esphome/components/esp32_camera/__init__.py b/esphome/components/esp32_camera/__init__.py index abbb4b1b7e..e3c7383953 100644 --- a/esphome/components/esp32_camera/__init__.py +++ b/esphome/components/esp32_camera/__init__.py @@ -2,6 +2,7 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome import pins from esphome.const import ( + CONF_DISABLED_BY_DEFAULT, CONF_FREQUENCY, CONF_ID, CONF_NAME, @@ -66,6 +67,7 @@ CONFIG_SCHEMA = cv.Schema( { cv.GenerateID(): cv.declare_id(ESP32Camera), cv.Required(CONF_NAME): cv.string, + cv.Optional(CONF_DISABLED_BY_DEFAULT, default=False): cv.boolean, cv.Required(CONF_DATA_PINS): cv.All([pins.input_pin], cv.Length(min=8, max=8)), cv.Required(CONF_VSYNC_PIN): pins.input_pin, cv.Required(CONF_HREF_PIN): pins.input_pin, @@ -124,6 +126,7 @@ SETTERS = { async def to_code(config): var = cg.new_Pvariable(config[CONF_ID], config[CONF_NAME]) + cg.add(var.set_disabled_by_default(config[CONF_DISABLED_BY_DEFAULT])) await cg.register_component(var, config) for key, setter in SETTERS.items(): diff --git a/esphome/components/fan/__init__.py b/esphome/components/fan/__init__.py index d1f43467ed..9db2e9ed12 100644 --- a/esphome/components/fan/__init__.py +++ b/esphome/components/fan/__init__.py @@ -4,6 +4,7 @@ from esphome import automation from esphome.automation import maybe_simple_id from esphome.components import mqtt from esphome.const import ( + CONF_DISABLED_BY_DEFAULT, CONF_ID, CONF_INTERNAL, CONF_MQTT_ID, @@ -34,7 +35,7 @@ ToggleAction = fan_ns.class_("ToggleAction", automation.Action) FanTurnOnTrigger = fan_ns.class_("FanTurnOnTrigger", automation.Trigger.template()) FanTurnOffTrigger = fan_ns.class_("FanTurnOffTrigger", automation.Trigger.template()) -FAN_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend( +FAN_SCHEMA = cv.NAMEABLE_SCHEMA.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA).extend( { cv.GenerateID(): cv.declare_id(FanState), cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTFanComponent), @@ -66,6 +67,7 @@ FAN_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend( async def setup_fan_core_(var, config): cg.add(var.set_name(config[CONF_NAME])) + cg.add(var.set_disabled_by_default(config[CONF_DISABLED_BY_DEFAULT])) if CONF_INTERNAL in config: cg.add(var.set_internal(config[CONF_INTERNAL])) diff --git a/esphome/components/light/__init__.py b/esphome/components/light/__init__.py index ec7d6bcbc0..52e8984545 100644 --- a/esphome/components/light/__init__.py +++ b/esphome/components/light/__init__.py @@ -5,6 +5,7 @@ from esphome.components import mqtt, power_supply from esphome.const import ( CONF_COLOR_CORRECT, CONF_DEFAULT_TRANSITION_LENGTH, + CONF_DISABLED_BY_DEFAULT, CONF_EFFECTS, CONF_GAMMA_CORRECT, CONF_ID, @@ -52,7 +53,7 @@ RESTORE_MODES = { "RESTORE_INVERTED_DEFAULT_ON": LightRestoreMode.LIGHT_RESTORE_INVERTED_DEFAULT_ON, } -LIGHT_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend( +LIGHT_SCHEMA = cv.NAMEABLE_SCHEMA.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA).extend( { cv.GenerateID(): cv.declare_id(LightState), cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTJSONLightComponent), @@ -121,6 +122,7 @@ def validate_color_temperature_channels(value): async def setup_light_core_(light_var, output_var, config): + cg.add(light_var.set_disabled_by_default(config[CONF_DISABLED_BY_DEFAULT])) cg.add(light_var.set_restore_mode(config[CONF_RESTORE_MODE])) if CONF_INTERNAL in config: cg.add(light_var.set_internal(config[CONF_INTERNAL])) diff --git a/esphome/components/number/__init__.py b/esphome/components/number/__init__.py index bf95cb1b31..88153492d3 100644 --- a/esphome/components/number/__init__.py +++ b/esphome/components/number/__init__.py @@ -6,6 +6,7 @@ from esphome.components import mqtt from esphome.const import ( CONF_ABOVE, CONF_BELOW, + CONF_DISABLED_BY_DEFAULT, CONF_ICON, CONF_ID, CONF_INTERNAL, @@ -45,7 +46,7 @@ NumberInRangeCondition = number_ns.class_( icon = cv.icon -NUMBER_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend( +NUMBER_SCHEMA = cv.NAMEABLE_SCHEMA.extend(cv.MQTT_COMPONENT_SCHEMA).extend( { cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTNumberComponent), cv.GenerateID(): cv.declare_id(Number), @@ -71,6 +72,7 @@ async def setup_number_core_( var, config, *, min_value: float, max_value: float, step: Optional[float] ): cg.add(var.set_name(config[CONF_NAME])) + cg.add(var.set_disabled_by_default(config[CONF_DISABLED_BY_DEFAULT])) if CONF_INTERNAL in config: cg.add(var.set_internal(config[CONF_INTERNAL])) diff --git a/esphome/components/select/__init__.py b/esphome/components/select/__init__.py index 5be09b0832..d3ab344926 100644 --- a/esphome/components/select/__init__.py +++ b/esphome/components/select/__init__.py @@ -4,6 +4,7 @@ import esphome.config_validation as cv from esphome import automation from esphome.components import mqtt from esphome.const import ( + CONF_DISABLED_BY_DEFAULT, CONF_ICON, CONF_ID, CONF_INTERNAL, @@ -34,7 +35,7 @@ SelectSetAction = select_ns.class_("SelectSetAction", automation.Action) icon = cv.icon -SELECT_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend( +SELECT_SCHEMA = cv.NAMEABLE_SCHEMA.extend(cv.MQTT_COMPONENT_SCHEMA).extend( { cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTSelectComponent), cv.GenerateID(): cv.declare_id(Select), @@ -50,6 +51,7 @@ SELECT_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend( async def setup_select_core_(var, config, *, options: List[str]): cg.add(var.set_name(config[CONF_NAME])) + cg.add(var.set_disabled_by_default(config[CONF_DISABLED_BY_DEFAULT])) if CONF_INTERNAL in config: cg.add(var.set_internal(config[CONF_INTERNAL])) diff --git a/esphome/components/sensor/__init__.py b/esphome/components/sensor/__init__.py index 6152f2cca5..19f2a9f0e6 100644 --- a/esphome/components/sensor/__init__.py +++ b/esphome/components/sensor/__init__.py @@ -10,6 +10,7 @@ from esphome.const import ( CONF_ACCURACY_DECIMALS, CONF_ALPHA, CONF_BELOW, + CONF_DISABLED_BY_DEFAULT, CONF_EXPIRE_AFTER, CONF_FILTERS, CONF_FROM, @@ -170,7 +171,7 @@ validate_accuracy_decimals = cv.int_ validate_icon = cv.icon validate_device_class = cv.one_of(*DEVICE_CLASSES, lower=True, space="_") -SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend( +SENSOR_SCHEMA = cv.NAMEABLE_SCHEMA.extend(cv.MQTT_COMPONENT_SCHEMA).extend( { cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTSensorComponent), cv.GenerateID(): cv.declare_id(Sensor), @@ -494,6 +495,7 @@ async def build_filters(config): async def setup_sensor_core_(var, config): cg.add(var.set_name(config[CONF_NAME])) + cg.add(var.set_disabled_by_default(config[CONF_DISABLED_BY_DEFAULT])) if CONF_INTERNAL in config: cg.add(var.set_internal(config[CONF_INTERNAL])) if CONF_DEVICE_CLASS in config: diff --git a/esphome/components/switch/__init__.py b/esphome/components/switch/__init__.py index 647041c19c..8aa213a9f6 100644 --- a/esphome/components/switch/__init__.py +++ b/esphome/components/switch/__init__.py @@ -4,6 +4,7 @@ from esphome import automation from esphome.automation import Condition, maybe_simple_id from esphome.components import mqtt from esphome.const import ( + CONF_DISABLED_BY_DEFAULT, CONF_ICON, CONF_ID, CONF_INTERNAL, @@ -38,7 +39,7 @@ SwitchTurnOffTrigger = switch_ns.class_( icon = cv.icon -SWITCH_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend( +SWITCH_SCHEMA = cv.NAMEABLE_SCHEMA.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA).extend( { cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTSwitchComponent), cv.Optional(CONF_ICON): icon, @@ -59,6 +60,7 @@ SWITCH_SCHEMA = cv.MQTT_COMMAND_COMPONENT_SCHEMA.extend( async def setup_switch_core_(var, config): cg.add(var.set_name(config[CONF_NAME])) + cg.add(var.set_disabled_by_default(config[CONF_DISABLED_BY_DEFAULT])) if CONF_INTERNAL in config: cg.add(var.set_internal(config[CONF_INTERNAL])) if CONF_ICON in config: diff --git a/esphome/components/text_sensor/__init__.py b/esphome/components/text_sensor/__init__.py index 84fedc8d94..d06f12de0e 100644 --- a/esphome/components/text_sensor/__init__.py +++ b/esphome/components/text_sensor/__init__.py @@ -3,6 +3,7 @@ import esphome.config_validation as cv from esphome import automation from esphome.components import mqtt from esphome.const import ( + CONF_DISABLED_BY_DEFAULT, CONF_ICON, CONF_ID, CONF_INTERNAL, @@ -33,7 +34,7 @@ TextSensorStateCondition = text_sensor_ns.class_( icon = cv.icon -TEXT_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend( +TEXT_SENSOR_SCHEMA = cv.NAMEABLE_SCHEMA.extend(cv.MQTT_COMPONENT_SCHEMA).extend( { cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTTextSensor), cv.Optional(CONF_ICON): icon, @@ -48,6 +49,7 @@ TEXT_SENSOR_SCHEMA = cv.MQTT_COMPONENT_SCHEMA.extend( async def setup_text_sensor_core_(var, config): cg.add(var.set_name(config[CONF_NAME])) + cg.add(var.set_disabled_by_default(config[CONF_DISABLED_BY_DEFAULT])) if CONF_INTERNAL in config: cg.add(var.set_internal(config[CONF_INTERNAL])) if CONF_ICON in config: diff --git a/esphome/config_validation.py b/esphome/config_validation.py index 9afed58f80..84452839ad 100644 --- a/esphome/config_validation.py +++ b/esphome/config_validation.py @@ -15,6 +15,7 @@ from esphome.const import ( ALLOWED_NAME_CHARS, CONF_AVAILABILITY, CONF_COMMAND_TOPIC, + CONF_DISABLED_BY_DEFAULT, CONF_DISCOVERY, CONF_ID, CONF_INTERNAL, @@ -1556,17 +1557,14 @@ MQTT_COMPONENT_AVAILABILITY_SCHEMA = Schema( MQTT_COMPONENT_SCHEMA = Schema( { - Optional(CONF_NAME): string, Optional(CONF_RETAIN): All(requires_component("mqtt"), boolean), Optional(CONF_DISCOVERY): All(requires_component("mqtt"), boolean), Optional(CONF_STATE_TOPIC): All(requires_component("mqtt"), publish_topic), Optional(CONF_AVAILABILITY): All( requires_component("mqtt"), Any(None, MQTT_COMPONENT_AVAILABILITY_SCHEMA) ), - Optional(CONF_INTERNAL): boolean, } ) -MQTT_COMPONENT_SCHEMA.add_extra(_nameable_validator) MQTT_COMMAND_COMPONENT_SCHEMA = MQTT_COMPONENT_SCHEMA.extend( { @@ -1574,6 +1572,16 @@ MQTT_COMMAND_COMPONENT_SCHEMA = MQTT_COMPONENT_SCHEMA.extend( } ) +NAMEABLE_SCHEMA = Schema( + { + Optional(CONF_NAME): string, + Optional(CONF_INTERNAL): boolean, + Optional(CONF_DISABLED_BY_DEFAULT, default=False): boolean, + } +) + +NAMEABLE_SCHEMA.add_extra(_nameable_validator) + COMPONENT_SCHEMA = Schema({Optional(CONF_SETUP_PRIORITY): float_}) diff --git a/esphome/const.py b/esphome/const.py index 075dc47411..117b9ccc3e 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -176,6 +176,7 @@ CONF_DIO_PIN = "dio_pin" CONF_DIR_PIN = "dir_pin" CONF_DIRECTION = "direction" CONF_DIRECTION_OUTPUT = "direction_output" +CONF_DISABLED_BY_DEFAULT = "disabled_by_default" CONF_DISCOVERY = "discovery" CONF_DISCOVERY_PREFIX = "discovery_prefix" CONF_DISCOVERY_RETAIN = "discovery_retain" diff --git a/esphome/core/component.cpp b/esphome/core/component.cpp index 09c91fbb0c..f6b15b1977 100644 --- a/esphome/core/component.cpp +++ b/esphome/core/component.cpp @@ -187,4 +187,7 @@ void Nameable::calc_object_id_() { } uint32_t Nameable::get_object_id_hash() { return this->object_id_hash_; } +bool Nameable::is_disabled_by_default() const { return this->disabled_by_default_; } +void Nameable::set_disabled_by_default(bool disabled_by_default) { this->disabled_by_default_ = disabled_by_default; } + } // namespace esphome diff --git a/esphome/core/component.h b/esphome/core/component.h index 433259f627..a4a945ef2a 100644 --- a/esphome/core/component.h +++ b/esphome/core/component.h @@ -256,6 +256,14 @@ class Nameable { bool is_internal() const; void set_internal(bool internal); + /** Check if this object is declared to be disabled by default. + * + * That means that when the device gets added to Home Assistant (or other clients) it should + * not be added to the default view by default, and a user action is necessary to manually add it. + */ + bool is_disabled_by_default() const; + void set_disabled_by_default(bool disabled_by_default); + protected: virtual uint32_t hash_base() = 0; @@ -265,6 +273,7 @@ class Nameable { std::string object_id_; uint32_t object_id_hash_; bool internal_{false}; + bool disabled_by_default_{false}; }; } // namespace esphome diff --git a/tests/test5.yaml b/tests/test5.yaml index 6ccb83a11a..5d4ff025d9 100644 --- a/tests/test5.yaml +++ b/tests/test5.yaml @@ -137,10 +137,13 @@ sensor: name: "SelecEM2M Frequency" maximum_demand_active_power: name: "SelecEM2M Maximum Demand Active Power" + disabled_by_default: true maximum_demand_reactive_power: name: "SelecEM2M Maximum Demand Reactive Power" + disabled_by_default: true maximum_demand_apparent_power: name: "SelecEM2M Maximum Demand Apparent Power" + disabled_by_default: true - platform: t6615 uart_id: uart2