mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	Merge remote-tracking branch 'upstream/dev' into api_ha_services
This commit is contained in:
		| @@ -54,6 +54,7 @@ CONF_ENCRYPTION = "encryption" | |||||||
| CONF_BATCH_DELAY = "batch_delay" | CONF_BATCH_DELAY = "batch_delay" | ||||||
| CONF_CUSTOM_SERVICES = "custom_services" | CONF_CUSTOM_SERVICES = "custom_services" | ||||||
| CONF_HOMEASSISTANT_SERVICES = "homeassistant_services" | CONF_HOMEASSISTANT_SERVICES = "homeassistant_services" | ||||||
|  | CONF_HOMEASSISTANT_STATES = "homeassistant_states" | ||||||
|  |  | ||||||
|  |  | ||||||
| def validate_encryption_key(value): | def validate_encryption_key(value): | ||||||
| @@ -120,6 +121,7 @@ CONFIG_SCHEMA = cv.All( | |||||||
|             ), |             ), | ||||||
|             cv.Optional(CONF_CUSTOM_SERVICES, default=False): cv.boolean, |             cv.Optional(CONF_CUSTOM_SERVICES, default=False): cv.boolean, | ||||||
|             cv.Optional(CONF_HOMEASSISTANT_SERVICES, default=False): cv.boolean, |             cv.Optional(CONF_HOMEASSISTANT_SERVICES, default=False): cv.boolean, | ||||||
|  |             cv.Optional(CONF_HOMEASSISTANT_STATES, default=False): cv.boolean, | ||||||
|             cv.Optional(CONF_ON_CLIENT_CONNECTED): automation.validate_automation( |             cv.Optional(CONF_ON_CLIENT_CONNECTED): automation.validate_automation( | ||||||
|                 single=True |                 single=True | ||||||
|             ), |             ), | ||||||
| @@ -151,6 +153,9 @@ async def to_code(config): | |||||||
|     if config[CONF_HOMEASSISTANT_SERVICES]: |     if config[CONF_HOMEASSISTANT_SERVICES]: | ||||||
|         cg.add_define("USE_API_HOMEASSISTANT_SERVICES") |         cg.add_define("USE_API_HOMEASSISTANT_SERVICES") | ||||||
|  |  | ||||||
|  |     if config[CONF_HOMEASSISTANT_STATES]: | ||||||
|  |         cg.add_define("USE_API_HOMEASSISTANT_STATES") | ||||||
|  |  | ||||||
|     if actions := config.get(CONF_ACTIONS, []): |     if actions := config.get(CONF_ACTIONS, []): | ||||||
|         for conf in actions: |         for conf in actions: | ||||||
|             template_args = [] |             template_args = [] | ||||||
|   | |||||||
| @@ -783,11 +783,13 @@ message HomeassistantServiceResponse { | |||||||
| message SubscribeHomeAssistantStatesRequest { | message SubscribeHomeAssistantStatesRequest { | ||||||
|   option (id) = 38; |   option (id) = 38; | ||||||
|   option (source) = SOURCE_CLIENT; |   option (source) = SOURCE_CLIENT; | ||||||
|  |   option (ifdef) = "USE_API_HOMEASSISTANT_STATES"; | ||||||
| } | } | ||||||
|  |  | ||||||
| message SubscribeHomeAssistantStateResponse { | message SubscribeHomeAssistantStateResponse { | ||||||
|   option (id) = 39; |   option (id) = 39; | ||||||
|   option (source) = SOURCE_SERVER; |   option (source) = SOURCE_SERVER; | ||||||
|  |   option (ifdef) = "USE_API_HOMEASSISTANT_STATES"; | ||||||
|   string entity_id = 1; |   string entity_id = 1; | ||||||
|   string attribute = 2; |   string attribute = 2; | ||||||
|   bool once = 3; |   bool once = 3; | ||||||
| @@ -797,6 +799,7 @@ message HomeAssistantStateResponse { | |||||||
|   option (id) = 40; |   option (id) = 40; | ||||||
|   option (source) = SOURCE_CLIENT; |   option (source) = SOURCE_CLIENT; | ||||||
|   option (no_delay) = true; |   option (no_delay) = true; | ||||||
|  |   option (ifdef) = "USE_API_HOMEASSISTANT_STATES"; | ||||||
|  |  | ||||||
|   string entity_id = 1; |   string entity_id = 1; | ||||||
|   string state = 2; |   string state = 2; | ||||||
|   | |||||||
| @@ -242,6 +242,7 @@ void APIConnection::loop() { | |||||||
|   } |   } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
|   if (state_subs_at_ >= 0) { |   if (state_subs_at_ >= 0) { | ||||||
|     const auto &subs = this->parent_->get_state_subs(); |     const auto &subs = this->parent_->get_state_subs(); | ||||||
|     if (state_subs_at_ < static_cast<int>(subs.size())) { |     if (state_subs_at_ < static_cast<int>(subs.size())) { | ||||||
| @@ -259,6 +260,7 @@ void APIConnection::loop() { | |||||||
|       state_subs_at_ = -1; |       state_subs_at_ = -1; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| bool APIConnection::send_disconnect_response(const DisconnectRequest &msg) { | bool APIConnection::send_disconnect_response(const DisconnectRequest &msg) { | ||||||
| @@ -1512,6 +1514,7 @@ bool APIConnection::send_device_info_response(const DeviceInfoRequest &msg) { | |||||||
|   return this->send_message(resp, DeviceInfoResponse::MESSAGE_TYPE); |   return this->send_message(resp, DeviceInfoResponse::MESSAGE_TYPE); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
| void APIConnection::on_home_assistant_state_response(const HomeAssistantStateResponse &msg) { | void APIConnection::on_home_assistant_state_response(const HomeAssistantStateResponse &msg) { | ||||||
|   for (auto &it : this->parent_->get_state_subs()) { |   for (auto &it : this->parent_->get_state_subs()) { | ||||||
|     if (it.entity_id == msg.entity_id && it.attribute.value() == msg.attribute) { |     if (it.entity_id == msg.entity_id && it.attribute.value() == msg.attribute) { | ||||||
| @@ -1519,6 +1522,7 @@ void APIConnection::on_home_assistant_state_response(const HomeAssistantStateRes | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | #endif | ||||||
| #ifdef USE_API_SERVICES | #ifdef USE_API_SERVICES | ||||||
| void APIConnection::execute_service(const ExecuteServiceRequest &msg) { | void APIConnection::execute_service(const ExecuteServiceRequest &msg) { | ||||||
|   bool found = false; |   bool found = false; | ||||||
| @@ -1550,9 +1554,11 @@ bool APIConnection::send_noise_encryption_set_key_response(const NoiseEncryption | |||||||
|   return this->send_message(resp, NoiseEncryptionSetKeyResponse::MESSAGE_TYPE); |   return this->send_message(resp, NoiseEncryptionSetKeyResponse::MESSAGE_TYPE); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
| void APIConnection::subscribe_home_assistant_states(const SubscribeHomeAssistantStatesRequest &msg) { | void APIConnection::subscribe_home_assistant_states(const SubscribeHomeAssistantStatesRequest &msg) { | ||||||
|   state_subs_at_ = 0; |   state_subs_at_ = 0; | ||||||
| } | } | ||||||
|  | #endif | ||||||
| bool APIConnection::try_to_clear_buffer(bool log_out_of_space) { | bool APIConnection::try_to_clear_buffer(bool log_out_of_space) { | ||||||
|   if (this->flags_.remove) |   if (this->flags_.remove) | ||||||
|     return false; |     return false; | ||||||
| @@ -1590,10 +1596,12 @@ bool APIConnection::send_buffer(ProtoWriteBuffer buffer, uint8_t message_type) { | |||||||
|   // Do not set last_traffic_ on send |   // Do not set last_traffic_ on send | ||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
|  | #ifdef USE_API_PASSWORD | ||||||
| void APIConnection::on_unauthenticated_access() { | void APIConnection::on_unauthenticated_access() { | ||||||
|   this->on_fatal_error(); |   this->on_fatal_error(); | ||||||
|   ESP_LOGD(TAG, "%s access without authentication", this->get_client_combined_info().c_str()); |   ESP_LOGD(TAG, "%s access without authentication", this->get_client_combined_info().c_str()); | ||||||
| } | } | ||||||
|  | #endif | ||||||
| void APIConnection::on_no_setup_connection() { | void APIConnection::on_no_setup_connection() { | ||||||
|   this->on_fatal_error(); |   this->on_fatal_error(); | ||||||
|   ESP_LOGD(TAG, "%s access without full connection", this->get_client_combined_info().c_str()); |   ESP_LOGD(TAG, "%s access without full connection", this->get_client_combined_info().c_str()); | ||||||
|   | |||||||
| @@ -190,7 +190,9 @@ class APIConnection : public APIServerConnection { | |||||||
|     // we initiated ping |     // we initiated ping | ||||||
|     this->flags_.sent_ping = false; |     this->flags_.sent_ping = false; | ||||||
|   } |   } | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
|   void on_home_assistant_state_response(const HomeAssistantStateResponse &msg) override; |   void on_home_assistant_state_response(const HomeAssistantStateResponse &msg) override; | ||||||
|  | #endif | ||||||
| #ifdef USE_HOMEASSISTANT_TIME | #ifdef USE_HOMEASSISTANT_TIME | ||||||
|   void on_get_time_response(const GetTimeResponse &value) override; |   void on_get_time_response(const GetTimeResponse &value) override; | ||||||
| #endif | #endif | ||||||
| @@ -214,7 +216,9 @@ class APIConnection : public APIServerConnection { | |||||||
|     this->flags_.service_call_subscription = true; |     this->flags_.service_call_subscription = true; | ||||||
|   } |   } | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
|   void subscribe_home_assistant_states(const SubscribeHomeAssistantStatesRequest &msg) override; |   void subscribe_home_assistant_states(const SubscribeHomeAssistantStatesRequest &msg) override; | ||||||
|  | #endif | ||||||
|   bool send_get_time_response(const GetTimeRequest &msg) override; |   bool send_get_time_response(const GetTimeRequest &msg) override; | ||||||
| #ifdef USE_API_SERVICES | #ifdef USE_API_SERVICES | ||||||
|   void execute_service(const ExecuteServiceRequest &msg) override; |   void execute_service(const ExecuteServiceRequest &msg) override; | ||||||
| @@ -232,7 +236,9 @@ class APIConnection : public APIServerConnection { | |||||||
|   } |   } | ||||||
|   uint8_t get_log_subscription_level() const { return this->flags_.log_subscription; } |   uint8_t get_log_subscription_level() const { return this->flags_.log_subscription; } | ||||||
|   void on_fatal_error() override; |   void on_fatal_error() override; | ||||||
|  | #ifdef USE_API_PASSWORD | ||||||
|   void on_unauthenticated_access() override; |   void on_unauthenticated_access() override; | ||||||
|  | #endif | ||||||
|   void on_no_setup_connection() override; |   void on_no_setup_connection() override; | ||||||
|   ProtoWriteBuffer create_buffer(uint32_t reserve_size) override { |   ProtoWriteBuffer create_buffer(uint32_t reserve_size) override { | ||||||
|     // FIXME: ensure no recursive writes can happen |     // FIXME: ensure no recursive writes can happen | ||||||
| @@ -496,7 +502,9 @@ class APIConnection : public APIServerConnection { | |||||||
|  |  | ||||||
|   // Group 4: 4-byte types |   // Group 4: 4-byte types | ||||||
|   uint32_t last_traffic_; |   uint32_t last_traffic_; | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
|   int state_subs_at_ = -1; |   int state_subs_at_ = -1; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|   // Function pointer type for message encoding |   // Function pointer type for message encoding | ||||||
|   using MessageCreatorPtr = uint16_t (*)(EntityBase *, APIConnection *, uint32_t remaining_size, bool is_single); |   using MessageCreatorPtr = uint16_t (*)(EntityBase *, APIConnection *, uint32_t remaining_size, bool is_single); | ||||||
|   | |||||||
| @@ -873,6 +873,7 @@ void HomeassistantServiceResponse::calculate_size(uint32_t &total_size) const { | |||||||
|   ProtoSize::add_bool_field(total_size, 1, this->is_event); |   ProtoSize::add_bool_field(total_size, 1, this->is_event); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
| void SubscribeHomeAssistantStateResponse::encode(ProtoWriteBuffer buffer) const { | void SubscribeHomeAssistantStateResponse::encode(ProtoWriteBuffer buffer) const { | ||||||
|   buffer.encode_string(1, this->entity_id_ref_); |   buffer.encode_string(1, this->entity_id_ref_); | ||||||
|   buffer.encode_string(2, this->attribute_ref_); |   buffer.encode_string(2, this->attribute_ref_); | ||||||
| @@ -899,6 +900,7 @@ bool HomeAssistantStateResponse::decode_length(uint32_t field_id, ProtoLengthDel | |||||||
|   } |   } | ||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
|  | #endif | ||||||
| bool GetTimeResponse::decode_32bit(uint32_t field_id, Proto32Bit value) { | bool GetTimeResponse::decode_32bit(uint32_t field_id, Proto32Bit value) { | ||||||
|   switch (field_id) { |   switch (field_id) { | ||||||
|     case 1: |     case 1: | ||||||
|   | |||||||
| @@ -1094,6 +1094,7 @@ class HomeassistantServiceResponse : public ProtoMessage { | |||||||
|  protected: |  protected: | ||||||
| }; | }; | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
| class SubscribeHomeAssistantStatesRequest : public ProtoDecodableMessage { | class SubscribeHomeAssistantStatesRequest : public ProtoDecodableMessage { | ||||||
|  public: |  public: | ||||||
|   static constexpr uint8_t MESSAGE_TYPE = 38; |   static constexpr uint8_t MESSAGE_TYPE = 38; | ||||||
| @@ -1144,6 +1145,7 @@ class HomeAssistantStateResponse : public ProtoDecodableMessage { | |||||||
|  protected: |  protected: | ||||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; |   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||||
| }; | }; | ||||||
|  | #endif | ||||||
| class GetTimeRequest : public ProtoDecodableMessage { | class GetTimeRequest : public ProtoDecodableMessage { | ||||||
|  public: |  public: | ||||||
|   static constexpr uint8_t MESSAGE_TYPE = 36; |   static constexpr uint8_t MESSAGE_TYPE = 36; | ||||||
|   | |||||||
| @@ -1068,6 +1068,7 @@ void HomeassistantServiceResponse::dump_to(std::string &out) const { | |||||||
|   dump_field(out, "is_event", this->is_event); |   dump_field(out, "is_event", this->is_event); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
| void SubscribeHomeAssistantStatesRequest::dump_to(std::string &out) const { | void SubscribeHomeAssistantStatesRequest::dump_to(std::string &out) const { | ||||||
|   out.append("SubscribeHomeAssistantStatesRequest {}"); |   out.append("SubscribeHomeAssistantStatesRequest {}"); | ||||||
| } | } | ||||||
| @@ -1083,6 +1084,7 @@ void HomeAssistantStateResponse::dump_to(std::string &out) const { | |||||||
|   dump_field(out, "state", this->state); |   dump_field(out, "state", this->state); | ||||||
|   dump_field(out, "attribute", this->attribute); |   dump_field(out, "attribute", this->attribute); | ||||||
| } | } | ||||||
|  | #endif | ||||||
| void GetTimeRequest::dump_to(std::string &out) const { out.append("GetTimeRequest {}"); } | void GetTimeRequest::dump_to(std::string &out) const { out.append("GetTimeRequest {}"); } | ||||||
| void GetTimeResponse::dump_to(std::string &out) const { dump_field(out, "epoch_seconds", this->epoch_seconds); } | void GetTimeResponse::dump_to(std::string &out) const { dump_field(out, "epoch_seconds", this->epoch_seconds); } | ||||||
| #ifdef USE_API_SERVICES | #ifdef USE_API_SERVICES | ||||||
|   | |||||||
| @@ -178,6 +178,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, | |||||||
|       this->on_get_time_response(msg); |       this->on_get_time_response(msg); | ||||||
|       break; |       break; | ||||||
|     } |     } | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
|     case SubscribeHomeAssistantStatesRequest::MESSAGE_TYPE: { |     case SubscribeHomeAssistantStatesRequest::MESSAGE_TYPE: { | ||||||
|       SubscribeHomeAssistantStatesRequest msg; |       SubscribeHomeAssistantStatesRequest msg; | ||||||
|       msg.decode(msg_data, msg_size); |       msg.decode(msg_data, msg_size); | ||||||
| @@ -187,6 +188,8 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, | |||||||
|       this->on_subscribe_home_assistant_states_request(msg); |       this->on_subscribe_home_assistant_states_request(msg); | ||||||
|       break; |       break; | ||||||
|     } |     } | ||||||
|  | #endif | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
|     case HomeAssistantStateResponse::MESSAGE_TYPE: { |     case HomeAssistantStateResponse::MESSAGE_TYPE: { | ||||||
|       HomeAssistantStateResponse msg; |       HomeAssistantStateResponse msg; | ||||||
|       msg.decode(msg_data, msg_size); |       msg.decode(msg_data, msg_size); | ||||||
| @@ -196,6 +199,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, | |||||||
|       this->on_home_assistant_state_response(msg); |       this->on_home_assistant_state_response(msg); | ||||||
|       break; |       break; | ||||||
|     } |     } | ||||||
|  | #endif | ||||||
| #ifdef USE_API_SERVICES | #ifdef USE_API_SERVICES | ||||||
|     case ExecuteServiceRequest::MESSAGE_TYPE: { |     case ExecuteServiceRequest::MESSAGE_TYPE: { | ||||||
|       ExecuteServiceRequest msg; |       ExecuteServiceRequest msg; | ||||||
| @@ -645,11 +649,13 @@ void APIServerConnection::on_subscribe_homeassistant_services_request( | |||||||
|   } |   } | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
| void APIServerConnection::on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &msg) { | void APIServerConnection::on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &msg) { | ||||||
|   if (this->check_authenticated_()) { |   if (this->check_authenticated_()) { | ||||||
|     this->subscribe_home_assistant_states(msg); |     this->subscribe_home_assistant_states(msg); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | #endif | ||||||
| void APIServerConnection::on_get_time_request(const GetTimeRequest &msg) { | void APIServerConnection::on_get_time_request(const GetTimeRequest &msg) { | ||||||
|   if (this->check_connection_setup_() && !this->send_get_time_response(msg)) { |   if (this->check_connection_setup_() && !this->send_get_time_response(msg)) { | ||||||
|     this->on_fatal_error(); |     this->on_fatal_error(); | ||||||
|   | |||||||
| @@ -64,9 +64,13 @@ class APIServerConnectionBase : public ProtoService { | |||||||
|   virtual void on_subscribe_homeassistant_services_request(const SubscribeHomeassistantServicesRequest &value){}; |   virtual void on_subscribe_homeassistant_services_request(const SubscribeHomeassistantServicesRequest &value){}; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
|   virtual void on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &value){}; |   virtual void on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &value){}; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
|   virtual void on_home_assistant_state_response(const HomeAssistantStateResponse &value){}; |   virtual void on_home_assistant_state_response(const HomeAssistantStateResponse &value){}; | ||||||
|  | #endif | ||||||
|   virtual void on_get_time_request(const GetTimeRequest &value){}; |   virtual void on_get_time_request(const GetTimeRequest &value){}; | ||||||
|   virtual void on_get_time_response(const GetTimeResponse &value){}; |   virtual void on_get_time_response(const GetTimeResponse &value){}; | ||||||
|  |  | ||||||
| @@ -219,7 +223,9 @@ class APIServerConnection : public APIServerConnectionBase { | |||||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||||
|   virtual void subscribe_homeassistant_services(const SubscribeHomeassistantServicesRequest &msg) = 0; |   virtual void subscribe_homeassistant_services(const SubscribeHomeassistantServicesRequest &msg) = 0; | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
|   virtual void subscribe_home_assistant_states(const SubscribeHomeAssistantStatesRequest &msg) = 0; |   virtual void subscribe_home_assistant_states(const SubscribeHomeAssistantStatesRequest &msg) = 0; | ||||||
|  | #endif | ||||||
|   virtual bool send_get_time_response(const GetTimeRequest &msg) = 0; |   virtual bool send_get_time_response(const GetTimeRequest &msg) = 0; | ||||||
| #ifdef USE_API_SERVICES | #ifdef USE_API_SERVICES | ||||||
|   virtual void execute_service(const ExecuteServiceRequest &msg) = 0; |   virtual void execute_service(const ExecuteServiceRequest &msg) = 0; | ||||||
| @@ -339,7 +345,9 @@ class APIServerConnection : public APIServerConnectionBase { | |||||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||||
|   void on_subscribe_homeassistant_services_request(const SubscribeHomeassistantServicesRequest &msg) override; |   void on_subscribe_homeassistant_services_request(const SubscribeHomeassistantServicesRequest &msg) override; | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
|   void on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &msg) override; |   void on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &msg) override; | ||||||
|  | #endif | ||||||
|   void on_get_time_request(const GetTimeRequest &msg) override; |   void on_get_time_request(const GetTimeRequest &msg) override; | ||||||
| #ifdef USE_API_SERVICES | #ifdef USE_API_SERVICES | ||||||
|   void on_execute_service_request(const ExecuteServiceRequest &msg) override; |   void on_execute_service_request(const ExecuteServiceRequest &msg) override; | ||||||
|   | |||||||
| @@ -377,6 +377,7 @@ void APIServer::send_homeassistant_service_call(const HomeassistantServiceRespon | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
| void APIServer::subscribe_home_assistant_state(std::string entity_id, optional<std::string> attribute, | void APIServer::subscribe_home_assistant_state(std::string entity_id, optional<std::string> attribute, | ||||||
|                                                std::function<void(std::string)> f) { |                                                std::function<void(std::string)> f) { | ||||||
|   this->state_subs_.push_back(HomeAssistantStateSubscription{ |   this->state_subs_.push_back(HomeAssistantStateSubscription{ | ||||||
| @@ -400,6 +401,7 @@ void APIServer::get_home_assistant_state(std::string entity_id, optional<std::st | |||||||
| const std::vector<APIServer::HomeAssistantStateSubscription> &APIServer::get_state_subs() const { | const std::vector<APIServer::HomeAssistantStateSubscription> &APIServer::get_state_subs() const { | ||||||
|   return this->state_subs_; |   return this->state_subs_; | ||||||
| } | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
| uint16_t APIServer::get_port() const { return this->port_; } | uint16_t APIServer::get_port() const { return this->port_; } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -128,6 +128,7 @@ class APIServer : public Component, public Controller { | |||||||
|  |  | ||||||
|   bool is_connected() const; |   bool is_connected() const; | ||||||
|  |  | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
|   struct HomeAssistantStateSubscription { |   struct HomeAssistantStateSubscription { | ||||||
|     std::string entity_id; |     std::string entity_id; | ||||||
|     optional<std::string> attribute; |     optional<std::string> attribute; | ||||||
| @@ -140,6 +141,7 @@ class APIServer : public Component, public Controller { | |||||||
|   void get_home_assistant_state(std::string entity_id, optional<std::string> attribute, |   void get_home_assistant_state(std::string entity_id, optional<std::string> attribute, | ||||||
|                                 std::function<void(std::string)> f); |                                 std::function<void(std::string)> f); | ||||||
|   const std::vector<HomeAssistantStateSubscription> &get_state_subs() const; |   const std::vector<HomeAssistantStateSubscription> &get_state_subs() const; | ||||||
|  | #endif | ||||||
| #ifdef USE_API_SERVICES | #ifdef USE_API_SERVICES | ||||||
|   const std::vector<UserServiceDescriptor *> &get_user_services() const { return this->user_services_; } |   const std::vector<UserServiceDescriptor *> &get_user_services() const { return this->user_services_; } | ||||||
| #endif | #endif | ||||||
| @@ -173,7 +175,9 @@ class APIServer : public Component, public Controller { | |||||||
|   std::string password_; |   std::string password_; | ||||||
| #endif | #endif | ||||||
|   std::vector<uint8_t> shared_write_buffer_;  // Shared proto write buffer for all connections |   std::vector<uint8_t> shared_write_buffer_;  // Shared proto write buffer for all connections | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
|   std::vector<HomeAssistantStateSubscription> state_subs_; |   std::vector<HomeAssistantStateSubscription> state_subs_; | ||||||
|  | #endif | ||||||
| #ifdef USE_API_SERVICES | #ifdef USE_API_SERVICES | ||||||
|   std::vector<UserServiceDescriptor *> user_services_; |   std::vector<UserServiceDescriptor *> user_services_; | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -83,6 +83,7 @@ class CustomAPIDevice { | |||||||
|   } |   } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef USE_API_HOMEASSISTANT_STATES | ||||||
|   /** Subscribe to the state (or attribute state) of an entity from Home Assistant. |   /** Subscribe to the state (or attribute state) of an entity from Home Assistant. | ||||||
|    * |    * | ||||||
|    * Usage: |    * Usage: | ||||||
| @@ -134,6 +135,7 @@ class CustomAPIDevice { | |||||||
|     auto f = std::bind(callback, (T *) this, entity_id, std::placeholders::_1); |     auto f = std::bind(callback, (T *) this, entity_id, std::placeholders::_1); | ||||||
|     global_api_server->subscribe_home_assistant_state(entity_id, optional<std::string>(attribute), f); |     global_api_server->subscribe_home_assistant_state(entity_id, optional<std::string>(attribute), f); | ||||||
|   } |   } | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||||
|   /** Call a Home Assistant service from ESPHome. |   /** Call a Home Assistant service from ESPHome. | ||||||
|   | |||||||
| @@ -860,7 +860,9 @@ class ProtoService { | |||||||
|   virtual bool is_authenticated() = 0; |   virtual bool is_authenticated() = 0; | ||||||
|   virtual bool is_connection_setup() = 0; |   virtual bool is_connection_setup() = 0; | ||||||
|   virtual void on_fatal_error() = 0; |   virtual void on_fatal_error() = 0; | ||||||
|  | #ifdef USE_API_PASSWORD | ||||||
|   virtual void on_unauthenticated_access() = 0; |   virtual void on_unauthenticated_access() = 0; | ||||||
|  | #endif | ||||||
|   virtual void on_no_setup_connection() = 0; |   virtual void on_no_setup_connection() = 0; | ||||||
|   /** |   /** | ||||||
|    * Create a buffer with a reserved size. |    * Create a buffer with a reserved size. | ||||||
| @@ -898,6 +900,7 @@ class ProtoService { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   bool check_authenticated_() { |   bool check_authenticated_() { | ||||||
|  | #ifdef USE_API_PASSWORD | ||||||
|     if (!this->check_connection_setup_()) { |     if (!this->check_connection_setup_()) { | ||||||
|       return false; |       return false; | ||||||
|     } |     } | ||||||
| @@ -906,6 +909,9 @@ class ProtoService { | |||||||
|       return false; |       return false; | ||||||
|     } |     } | ||||||
|     return true; |     return true; | ||||||
|  | #else | ||||||
|  |     return this->check_connection_setup_(); | ||||||
|  | #endif | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -38,3 +38,4 @@ def setup_home_assistant_entity(var, config): | |||||||
|     cg.add(var.set_entity_id(config[CONF_ENTITY_ID])) |     cg.add(var.set_entity_id(config[CONF_ENTITY_ID])) | ||||||
|     if CONF_ATTRIBUTE in config: |     if CONF_ATTRIBUTE in config: | ||||||
|         cg.add(var.set_attribute(config[CONF_ATTRIBUTE])) |         cg.add(var.set_attribute(config[CONF_ATTRIBUTE])) | ||||||
|  |     cg.add_define("USE_API_HOMEASSISTANT_STATES") | ||||||
|   | |||||||
| @@ -151,13 +151,13 @@ void IDFI2CBus::dump_config() { | |||||||
|       break; |       break; | ||||||
|   } |   } | ||||||
|   if (this->scan_) { |   if (this->scan_) { | ||||||
|     ESP_LOGI(TAG, "Results from bus scan:"); |     ESP_LOGCONFIG(TAG, "Results from bus scan:"); | ||||||
|     if (scan_results_.empty()) { |     if (scan_results_.empty()) { | ||||||
|       ESP_LOGI(TAG, "Found no devices"); |       ESP_LOGCONFIG(TAG, "Found no devices"); | ||||||
|     } else { |     } else { | ||||||
|       for (const auto &s : scan_results_) { |       for (const auto &s : scan_results_) { | ||||||
|         if (s.second) { |         if (s.second) { | ||||||
|           ESP_LOGI(TAG, "Found device at address 0x%02X", s.first); |           ESP_LOGCONFIG(TAG, "Found device at address 0x%02X", s.first); | ||||||
|         } else { |         } else { | ||||||
|           ESP_LOGE(TAG, "Unknown error at address 0x%02X", s.first); |           ESP_LOGE(TAG, "Unknown error at address 0x%02X", s.first); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -421,6 +421,7 @@ CONF_LOGGER_LOG = "logger.log" | |||||||
| LOGGER_LOG_ACTION_SCHEMA = cv.All( | LOGGER_LOG_ACTION_SCHEMA = cv.All( | ||||||
|     cv.maybe_simple_value( |     cv.maybe_simple_value( | ||||||
|         { |         { | ||||||
|  |             cv.GenerateID(CONF_LOGGER_ID): cv.use_id(Logger), | ||||||
|             cv.Required(CONF_FORMAT): cv.string, |             cv.Required(CONF_FORMAT): cv.string, | ||||||
|             cv.Optional(CONF_ARGS, default=list): cv.ensure_list(cv.lambda_), |             cv.Optional(CONF_ARGS, default=list): cv.ensure_list(cv.lambda_), | ||||||
|             cv.Optional(CONF_LEVEL, default="DEBUG"): cv.one_of( |             cv.Optional(CONF_LEVEL, default="DEBUG"): cv.one_of( | ||||||
|   | |||||||
| @@ -110,6 +110,7 @@ | |||||||
| #define USE_API_CLIENT_CONNECTED_TRIGGER | #define USE_API_CLIENT_CONNECTED_TRIGGER | ||||||
| #define USE_API_CLIENT_DISCONNECTED_TRIGGER | #define USE_API_CLIENT_DISCONNECTED_TRIGGER | ||||||
| #define USE_API_HOMEASSISTANT_SERVICES | #define USE_API_HOMEASSISTANT_SERVICES | ||||||
|  | #define USE_API_HOMEASSISTANT_STATES | ||||||
| #define USE_API_NOISE | #define USE_API_NOISE | ||||||
| #define USE_API_PLAINTEXT | #define USE_API_PLAINTEXT | ||||||
| #define USE_API_SERVICES | #define USE_API_SERVICES | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ platformio==6.1.18  # When updating platformio, also update /docker/Dockerfile | |||||||
| esptool==4.9.0 | esptool==4.9.0 | ||||||
| click==8.1.7 | click==8.1.7 | ||||||
| esphome-dashboard==20250514.0 | esphome-dashboard==20250514.0 | ||||||
| aioesphomeapi==37.0.4 | aioesphomeapi==37.1.0 | ||||||
| zeroconf==0.147.0 | zeroconf==0.147.0 | ||||||
| puremagic==1.30 | puremagic==1.30 | ||||||
| ruamel.yaml==0.18.14 # dashboard_import | ruamel.yaml==0.18.14 # dashboard_import | ||||||
|   | |||||||
| @@ -4,6 +4,8 @@ esphome: | |||||||
| esp32: | esp32: | ||||||
|   board: esp32dev |   board: esp32dev | ||||||
|  |  | ||||||
|  | logger: | ||||||
|  |  | ||||||
| text: | text: | ||||||
|   - platform: template |   - platform: template | ||||||
|     name: "test 1 text" |     name: "test 1 text" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user