mirror of
				https://github.com/esphome/esphome.git
				synced 2025-11-03 08:31:47 +00:00 
			
		
		
		
	Add area (zone) to esphome core config to be suggested through API and MQTT. (#5602)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
		@@ -217,6 +217,8 @@ message DeviceInfoResponse {
 | 
			
		||||
  string friendly_name = 13;
 | 
			
		||||
 | 
			
		||||
  uint32 voice_assistant_version = 14;
 | 
			
		||||
 | 
			
		||||
  string suggested_area = 16;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message ListEntitiesRequest {
 | 
			
		||||
 
 | 
			
		||||
@@ -1084,6 +1084,7 @@ DeviceInfoResponse APIConnection::device_info(const DeviceInfoRequest &msg) {
 | 
			
		||||
  resp.uses_password = this->parent_->uses_password();
 | 
			
		||||
  resp.name = App.get_name();
 | 
			
		||||
  resp.friendly_name = App.get_friendly_name();
 | 
			
		||||
  resp.suggested_area = App.get_area();
 | 
			
		||||
  resp.mac_address = get_mac_address_pretty();
 | 
			
		||||
  resp.esphome_version = ESPHOME_VERSION;
 | 
			
		||||
  resp.compilation_time = App.get_compilation_time();
 | 
			
		||||
 
 | 
			
		||||
@@ -761,6 +761,10 @@ bool DeviceInfoResponse::decode_length(uint32_t field_id, ProtoLengthDelimited v
 | 
			
		||||
      this->friendly_name = value.as_string();
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
    case 16: {
 | 
			
		||||
      this->suggested_area = value.as_string();
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
    default:
 | 
			
		||||
      return false;
 | 
			
		||||
  }
 | 
			
		||||
@@ -781,6 +785,7 @@ void DeviceInfoResponse::encode(ProtoWriteBuffer buffer) const {
 | 
			
		||||
  buffer.encode_string(12, this->manufacturer);
 | 
			
		||||
  buffer.encode_string(13, this->friendly_name);
 | 
			
		||||
  buffer.encode_uint32(14, this->voice_assistant_version);
 | 
			
		||||
  buffer.encode_string(16, this->suggested_area);
 | 
			
		||||
}
 | 
			
		||||
#ifdef HAS_PROTO_MESSAGE_DUMP
 | 
			
		||||
void DeviceInfoResponse::dump_to(std::string &out) const {
 | 
			
		||||
@@ -849,6 +854,10 @@ void DeviceInfoResponse::dump_to(std::string &out) const {
 | 
			
		||||
  sprintf(buffer, "%" PRIu32, this->voice_assistant_version);
 | 
			
		||||
  out.append(buffer);
 | 
			
		||||
  out.append("\n");
 | 
			
		||||
 | 
			
		||||
  out.append("  suggested_area: ");
 | 
			
		||||
  out.append("'").append(this->suggested_area).append("'");
 | 
			
		||||
  out.append("\n");
 | 
			
		||||
  out.append("}");
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -328,6 +328,7 @@ class DeviceInfoResponse : public ProtoMessage {
 | 
			
		||||
  std::string manufacturer{};
 | 
			
		||||
  std::string friendly_name{};
 | 
			
		||||
  uint32_t voice_assistant_version{0};
 | 
			
		||||
  std::string suggested_area{};
 | 
			
		||||
  void encode(ProtoWriteBuffer buffer) const override;
 | 
			
		||||
#ifdef HAS_PROTO_MESSAGE_DUMP
 | 
			
		||||
  void dump_to(std::string &out) const override;
 | 
			
		||||
 
 | 
			
		||||
@@ -136,6 +136,7 @@ bool MQTTComponent::send_discovery_() {
 | 
			
		||||
        if (node_friendly_name.empty()) {
 | 
			
		||||
          node_friendly_name = node_name;
 | 
			
		||||
        }
 | 
			
		||||
        const std::string &node_area = App.get_area();
 | 
			
		||||
 | 
			
		||||
        JsonObject device_info = root.createNestedObject(MQTT_DEVICE);
 | 
			
		||||
        device_info[MQTT_DEVICE_IDENTIFIERS] = get_mac_address();
 | 
			
		||||
@@ -143,6 +144,7 @@ bool MQTTComponent::send_discovery_() {
 | 
			
		||||
        device_info[MQTT_DEVICE_SW_VERSION] = "esphome v" ESPHOME_VERSION " " + App.get_compilation_time();
 | 
			
		||||
        device_info[MQTT_DEVICE_MODEL] = ESPHOME_BOARD;
 | 
			
		||||
        device_info[MQTT_DEVICE_MANUFACTURER] = "espressif";
 | 
			
		||||
        device_info[MQTT_DEVICE_SUGGESTED_AREA] = node_area;
 | 
			
		||||
      },
 | 
			
		||||
      0, discovery_info.retain);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -53,6 +53,7 @@ CONF_AND = "and"
 | 
			
		||||
CONF_AP = "ap"
 | 
			
		||||
CONF_APPARENT_POWER = "apparent_power"
 | 
			
		||||
CONF_ARDUINO_VERSION = "arduino_version"
 | 
			
		||||
CONF_AREA = "area"
 | 
			
		||||
CONF_ARGS = "args"
 | 
			
		||||
CONF_ASSUMED_STATE = "assumed_state"
 | 
			
		||||
CONF_AT = "at"
 | 
			
		||||
 
 | 
			
		||||
@@ -464,6 +464,8 @@ class EsphomeCore:
 | 
			
		||||
        self.name: Optional[str] = None
 | 
			
		||||
        # The friendly name of the node
 | 
			
		||||
        self.friendly_name: Optional[str] = None
 | 
			
		||||
        # The area / zone of the node
 | 
			
		||||
        self.area: Optional[str] = None
 | 
			
		||||
        # Additional data components can store temporary data in
 | 
			
		||||
        # The first key to this dict should always be the integration name
 | 
			
		||||
        self.data = {}
 | 
			
		||||
@@ -504,6 +506,7 @@ class EsphomeCore:
 | 
			
		||||
        self.dashboard = False
 | 
			
		||||
        self.name = None
 | 
			
		||||
        self.friendly_name = None
 | 
			
		||||
        self.area = None
 | 
			
		||||
        self.data = {}
 | 
			
		||||
        self.config_path = None
 | 
			
		||||
        self.build_path = None
 | 
			
		||||
 
 | 
			
		||||
@@ -59,8 +59,8 @@ namespace esphome {
 | 
			
		||||
 | 
			
		||||
class Application {
 | 
			
		||||
 public:
 | 
			
		||||
  void pre_setup(const std::string &name, const std::string &friendly_name, const char *comment,
 | 
			
		||||
                 const char *compilation_time, bool name_add_mac_suffix) {
 | 
			
		||||
  void pre_setup(const std::string &name, const std::string &friendly_name, const std::string &area,
 | 
			
		||||
                 const char *comment, const char *compilation_time, bool name_add_mac_suffix) {
 | 
			
		||||
    arch_init();
 | 
			
		||||
    this->name_add_mac_suffix_ = name_add_mac_suffix;
 | 
			
		||||
    if (name_add_mac_suffix) {
 | 
			
		||||
@@ -74,6 +74,7 @@ class Application {
 | 
			
		||||
      this->name_ = name;
 | 
			
		||||
      this->friendly_name_ = friendly_name;
 | 
			
		||||
    }
 | 
			
		||||
    this->area_ = area;
 | 
			
		||||
    this->comment_ = comment;
 | 
			
		||||
    this->compilation_time_ = compilation_time;
 | 
			
		||||
  }
 | 
			
		||||
@@ -160,6 +161,10 @@ class Application {
 | 
			
		||||
 | 
			
		||||
  /// Get the friendly name of this Application set by pre_setup().
 | 
			
		||||
  const std::string &get_friendly_name() const { return this->friendly_name_; }
 | 
			
		||||
 | 
			
		||||
  /// Get the area of this Application set by pre_setup().
 | 
			
		||||
  const std::string &get_area() const { return this->area_; }
 | 
			
		||||
 | 
			
		||||
  /// Get the comment of this Application set by pre_setup().
 | 
			
		||||
  std::string get_comment() const { return this->comment_; }
 | 
			
		||||
 | 
			
		||||
@@ -395,6 +400,7 @@ class Application {
 | 
			
		||||
 | 
			
		||||
  std::string name_;
 | 
			
		||||
  std::string friendly_name_;
 | 
			
		||||
  std::string area_;
 | 
			
		||||
  const char *comment_{nullptr};
 | 
			
		||||
  const char *compilation_time_{nullptr};
 | 
			
		||||
  bool name_add_mac_suffix_;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@ import esphome.config_validation as cv
 | 
			
		||||
from esphome import automation
 | 
			
		||||
from esphome.const import (
 | 
			
		||||
    CONF_ARDUINO_VERSION,
 | 
			
		||||
    CONF_AREA,
 | 
			
		||||
    CONF_BOARD,
 | 
			
		||||
    CONF_BOARD_FLASH_MODE,
 | 
			
		||||
    CONF_BUILD_PATH,
 | 
			
		||||
@@ -126,6 +127,7 @@ CONFIG_SCHEMA = cv.All(
 | 
			
		||||
        {
 | 
			
		||||
            cv.Required(CONF_NAME): cv.valid_name,
 | 
			
		||||
            cv.Optional(CONF_FRIENDLY_NAME, ""): cv.string,
 | 
			
		||||
            cv.Optional(CONF_AREA, ""): cv.string,
 | 
			
		||||
            cv.Optional(CONF_COMMENT): cv.string,
 | 
			
		||||
            cv.Required(CONF_BUILD_PATH): cv.string,
 | 
			
		||||
            cv.Optional(CONF_PLATFORMIO_OPTIONS, default={}): cv.Schema(
 | 
			
		||||
@@ -350,6 +352,7 @@ async def to_code(config):
 | 
			
		||||
        cg.App.pre_setup(
 | 
			
		||||
            config[CONF_NAME],
 | 
			
		||||
            config[CONF_FRIENDLY_NAME],
 | 
			
		||||
            config[CONF_AREA],
 | 
			
		||||
            config.get(CONF_COMMENT, ""),
 | 
			
		||||
            cg.RawExpression('__DATE__ ", " __TIME__'),
 | 
			
		||||
            config[CONF_NAME_ADD_MAC_SUFFIX],
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
using namespace esphome;
 | 
			
		||||
 | 
			
		||||
void setup() {
 | 
			
		||||
  App.pre_setup("livingroom", "LivingRoom", "comment", __DATE__ ", " __TIME__, false);
 | 
			
		||||
  App.pre_setup("livingroom", "LivingRoom", "LivingRoomArea", "comment", __DATE__ ", " __TIME__, false);
 | 
			
		||||
  auto *log = new logger::Logger(115200, 512);  // NOLINT
 | 
			
		||||
  log->pre_setup();
 | 
			
		||||
  log->set_uart_selection(logger::UART_SELECTION_UART0);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user