mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	[api] Add conditional compilation for Home Assistant service subscriptions
This commit is contained in:
		| @@ -53,6 +53,7 @@ SERVICE_ARG_NATIVE_TYPES = { | ||||
| CONF_ENCRYPTION = "encryption" | ||||
| CONF_BATCH_DELAY = "batch_delay" | ||||
| CONF_CUSTOM_SERVICES = "custom_services" | ||||
| CONF_HOMEASSISTANT_SERVICES = "homeassistant_services" | ||||
|  | ||||
|  | ||||
| def validate_encryption_key(value): | ||||
| @@ -118,6 +119,7 @@ CONFIG_SCHEMA = cv.All( | ||||
|                 cv.Range(max=cv.TimePeriod(milliseconds=65535)), | ||||
|             ), | ||||
|             cv.Optional(CONF_CUSTOM_SERVICES, default=False): cv.boolean, | ||||
|             cv.Optional(CONF_HOMEASSISTANT_SERVICES, default=False): cv.boolean, | ||||
|             cv.Optional(CONF_ON_CLIENT_CONNECTED): automation.validate_automation( | ||||
|                 single=True | ||||
|             ), | ||||
| @@ -146,6 +148,9 @@ async def to_code(config): | ||||
|     if config.get(CONF_ACTIONS) or config[CONF_CUSTOM_SERVICES]: | ||||
|         cg.add_define("USE_API_SERVICES") | ||||
|  | ||||
|     if config[CONF_HOMEASSISTANT_SERVICES]: | ||||
|         cg.add_define("USE_API_HOMEASSISTANT_SERVICES") | ||||
|  | ||||
|     if actions := config.get(CONF_ACTIONS, []): | ||||
|         for conf in actions: | ||||
|             template_args = [] | ||||
| @@ -235,6 +240,7 @@ HOMEASSISTANT_ACTION_ACTION_SCHEMA = cv.All( | ||||
|     HOMEASSISTANT_ACTION_ACTION_SCHEMA, | ||||
| ) | ||||
| async def homeassistant_service_to_code(config, action_id, template_arg, args): | ||||
|     cg.add_define("USE_API_HOMEASSISTANT_SERVICES") | ||||
|     serv = await cg.get_variable(config[CONF_ID]) | ||||
|     var = cg.new_Pvariable(action_id, template_arg, serv, False) | ||||
|     templ = await cg.templatable(config[CONF_ACTION], args, None) | ||||
| @@ -278,6 +284,7 @@ HOMEASSISTANT_EVENT_ACTION_SCHEMA = cv.Schema( | ||||
|     HOMEASSISTANT_EVENT_ACTION_SCHEMA, | ||||
| ) | ||||
| async def homeassistant_event_to_code(config, action_id, template_arg, args): | ||||
|     cg.add_define("USE_API_HOMEASSISTANT_SERVICES") | ||||
|     serv = await cg.get_variable(config[CONF_ID]) | ||||
|     var = cg.new_Pvariable(action_id, template_arg, serv, True) | ||||
|     templ = await cg.templatable(config[CONF_EVENT], args, None) | ||||
|   | ||||
| @@ -755,6 +755,7 @@ message NoiseEncryptionSetKeyResponse { | ||||
| message SubscribeHomeassistantServicesRequest { | ||||
|   option (id) = 34; | ||||
|   option (source) = SOURCE_CLIENT; | ||||
|   option (ifdef) = "USE_API_HOMEASSISTANT_SERVICES"; | ||||
| } | ||||
|  | ||||
| message HomeassistantServiceMap { | ||||
| @@ -766,6 +767,7 @@ message HomeassistantServiceResponse { | ||||
|   option (id) = 35; | ||||
|   option (source) = SOURCE_SERVER; | ||||
|   option (no_delay) = true; | ||||
|   option (ifdef) = "USE_API_HOMEASSISTANT_SERVICES"; | ||||
|  | ||||
|   string service = 1; | ||||
|   repeated HomeassistantServiceMap data = 2; | ||||
|   | ||||
| @@ -131,11 +131,13 @@ class APIConnection : public APIServerConnection { | ||||
|   void media_player_command(const MediaPlayerCommandRequest &msg) override; | ||||
| #endif | ||||
|   bool try_send_log_message(int level, const char *tag, const char *line, size_t message_len); | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
|   void send_homeassistant_service_call(const HomeassistantServiceResponse &call) { | ||||
|     if (!this->flags_.service_call_subscription) | ||||
|       return; | ||||
|     this->send_message(call, HomeassistantServiceResponse::MESSAGE_TYPE); | ||||
|   } | ||||
| #endif | ||||
| #ifdef USE_BLUETOOTH_PROXY | ||||
|   void subscribe_bluetooth_le_advertisements(const SubscribeBluetoothLEAdvertisementsRequest &msg) override; | ||||
|   void unsubscribe_bluetooth_le_advertisements(const UnsubscribeBluetoothLEAdvertisementsRequest &msg) override; | ||||
| @@ -207,9 +209,11 @@ class APIConnection : public APIServerConnection { | ||||
|     if (msg.dump_config) | ||||
|       App.schedule_dump_config(); | ||||
|   } | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
|   void subscribe_homeassistant_services(const SubscribeHomeassistantServicesRequest &msg) override { | ||||
|     this->flags_.service_call_subscription = true; | ||||
|   } | ||||
| #endif | ||||
|   void subscribe_home_assistant_states(const SubscribeHomeAssistantStatesRequest &msg) override; | ||||
|   bool send_get_time_response(const GetTimeRequest &msg) override; | ||||
| #ifdef USE_API_SERVICES | ||||
|   | ||||
| @@ -843,6 +843,7 @@ void NoiseEncryptionSetKeyResponse::calculate_size(uint32_t &total_size) const { | ||||
|   ProtoSize::add_bool_field(total_size, 1, this->success); | ||||
| } | ||||
| #endif | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
| void HomeassistantServiceMap::encode(ProtoWriteBuffer buffer) const { | ||||
|   buffer.encode_string(1, this->key_ref_); | ||||
|   buffer.encode_string(2, this->value_ref_); | ||||
| @@ -871,6 +872,7 @@ void HomeassistantServiceResponse::calculate_size(uint32_t &total_size) const { | ||||
|   ProtoSize::add_repeated_message(total_size, 1, this->variables); | ||||
|   ProtoSize::add_bool_field(total_size, 1, this->is_event); | ||||
| } | ||||
| #endif | ||||
| void SubscribeHomeAssistantStateResponse::encode(ProtoWriteBuffer buffer) const { | ||||
|   buffer.encode_string(1, this->entity_id_ref_); | ||||
|   buffer.encode_string(2, this->attribute_ref_); | ||||
|   | ||||
| @@ -1044,6 +1044,7 @@ class NoiseEncryptionSetKeyResponse : public ProtoMessage { | ||||
|  protected: | ||||
| }; | ||||
| #endif | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
| class SubscribeHomeassistantServicesRequest : public ProtoDecodableMessage { | ||||
|  public: | ||||
|   static constexpr uint8_t MESSAGE_TYPE = 34; | ||||
| @@ -1092,6 +1093,7 @@ class HomeassistantServiceResponse : public ProtoMessage { | ||||
|  | ||||
|  protected: | ||||
| }; | ||||
| #endif | ||||
| class SubscribeHomeAssistantStatesRequest : public ProtoDecodableMessage { | ||||
|  public: | ||||
|   static constexpr uint8_t MESSAGE_TYPE = 38; | ||||
|   | ||||
| @@ -1038,6 +1038,7 @@ void NoiseEncryptionSetKeyRequest::dump_to(std::string &out) const { | ||||
| } | ||||
| void NoiseEncryptionSetKeyResponse::dump_to(std::string &out) const { dump_field(out, "success", this->success); } | ||||
| #endif | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
| void SubscribeHomeassistantServicesRequest::dump_to(std::string &out) const { | ||||
|   out.append("SubscribeHomeassistantServicesRequest {}"); | ||||
| } | ||||
| @@ -1066,6 +1067,7 @@ void HomeassistantServiceResponse::dump_to(std::string &out) const { | ||||
|   } | ||||
|   dump_field(out, "is_event", this->is_event); | ||||
| } | ||||
| #endif | ||||
| void SubscribeHomeAssistantStatesRequest::dump_to(std::string &out) const { | ||||
|   out.append("SubscribeHomeAssistantStatesRequest {}"); | ||||
| } | ||||
|   | ||||
| @@ -149,6 +149,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, | ||||
|       break; | ||||
|     } | ||||
| #endif | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
|     case SubscribeHomeassistantServicesRequest::MESSAGE_TYPE: { | ||||
|       SubscribeHomeassistantServicesRequest msg; | ||||
|       msg.decode(msg_data, msg_size); | ||||
| @@ -158,6 +159,7 @@ void APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, | ||||
|       this->on_subscribe_homeassistant_services_request(msg); | ||||
|       break; | ||||
|     } | ||||
| #endif | ||||
|     case GetTimeRequest::MESSAGE_TYPE: { | ||||
|       GetTimeRequest msg; | ||||
|       msg.decode(msg_data, msg_size); | ||||
| @@ -635,12 +637,14 @@ void APIServerConnection::on_subscribe_logs_request(const SubscribeLogsRequest & | ||||
|     this->subscribe_logs(msg); | ||||
|   } | ||||
| } | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
| void APIServerConnection::on_subscribe_homeassistant_services_request( | ||||
|     const SubscribeHomeassistantServicesRequest &msg) { | ||||
|   if (this->check_authenticated_()) { | ||||
|     this->subscribe_homeassistant_services(msg); | ||||
|   } | ||||
| } | ||||
| #endif | ||||
| void APIServerConnection::on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &msg) { | ||||
|   if (this->check_authenticated_()) { | ||||
|     this->subscribe_home_assistant_states(msg); | ||||
|   | ||||
| @@ -60,7 +60,9 @@ class APIServerConnectionBase : public ProtoService { | ||||
|   virtual void on_noise_encryption_set_key_request(const NoiseEncryptionSetKeyRequest &value){}; | ||||
| #endif | ||||
|  | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
|   virtual void on_subscribe_homeassistant_services_request(const SubscribeHomeassistantServicesRequest &value){}; | ||||
| #endif | ||||
|  | ||||
|   virtual void on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &value){}; | ||||
|  | ||||
| @@ -214,7 +216,9 @@ class APIServerConnection : public APIServerConnectionBase { | ||||
|   virtual void list_entities(const ListEntitiesRequest &msg) = 0; | ||||
|   virtual void subscribe_states(const SubscribeStatesRequest &msg) = 0; | ||||
|   virtual void subscribe_logs(const SubscribeLogsRequest &msg) = 0; | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
|   virtual void subscribe_homeassistant_services(const SubscribeHomeassistantServicesRequest &msg) = 0; | ||||
| #endif | ||||
|   virtual void subscribe_home_assistant_states(const SubscribeHomeAssistantStatesRequest &msg) = 0; | ||||
|   virtual bool send_get_time_response(const GetTimeRequest &msg) = 0; | ||||
| #ifdef USE_API_SERVICES | ||||
| @@ -332,7 +336,9 @@ class APIServerConnection : public APIServerConnectionBase { | ||||
|   void on_list_entities_request(const ListEntitiesRequest &msg) override; | ||||
|   void on_subscribe_states_request(const SubscribeStatesRequest &msg) override; | ||||
|   void on_subscribe_logs_request(const SubscribeLogsRequest &msg) override; | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
|   void on_subscribe_homeassistant_services_request(const SubscribeHomeassistantServicesRequest &msg) override; | ||||
| #endif | ||||
|   void on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &msg) override; | ||||
|   void on_get_time_request(const GetTimeRequest &msg) override; | ||||
| #ifdef USE_API_SERVICES | ||||
|   | ||||
| @@ -369,11 +369,13 @@ void APIServer::set_password(const std::string &password) { this->password_ = pa | ||||
|  | ||||
| void APIServer::set_batch_delay(uint16_t batch_delay) { this->batch_delay_ = batch_delay; } | ||||
|  | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
| void APIServer::send_homeassistant_service_call(const HomeassistantServiceResponse &call) { | ||||
|   for (auto &client : this->clients_) { | ||||
|     client->send_homeassistant_service_call(call); | ||||
|   } | ||||
| } | ||||
| #endif | ||||
|  | ||||
| void APIServer::subscribe_home_assistant_state(std::string entity_id, optional<std::string> attribute, | ||||
|                                                std::function<void(std::string)> f) { | ||||
|   | ||||
| @@ -106,7 +106,9 @@ class APIServer : public Component, public Controller { | ||||
| #ifdef USE_MEDIA_PLAYER | ||||
|   void on_media_player_update(media_player::MediaPlayer *obj) override; | ||||
| #endif | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
|   void send_homeassistant_service_call(const HomeassistantServiceResponse &call); | ||||
| #endif | ||||
| #ifdef USE_API_SERVICES | ||||
|   void register_user_service(UserServiceDescriptor *descriptor) { this->user_services_.push_back(descriptor); } | ||||
| #endif | ||||
|   | ||||
| @@ -135,6 +135,7 @@ class CustomAPIDevice { | ||||
|     global_api_server->subscribe_home_assistant_state(entity_id, optional<std::string>(attribute), f); | ||||
|   } | ||||
|  | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
|   /** Call a Home Assistant service from ESPHome. | ||||
|    * | ||||
|    * Usage: | ||||
| @@ -219,6 +220,7 @@ class CustomAPIDevice { | ||||
|     } | ||||
|     global_api_server->send_homeassistant_service_call(resp); | ||||
|   } | ||||
| #endif | ||||
| }; | ||||
|  | ||||
| }  // namespace esphome::api | ||||
|   | ||||
| @@ -2,6 +2,7 @@ | ||||
|  | ||||
| #include "api_server.h" | ||||
| #ifdef USE_API | ||||
| #ifdef USE_API_HOMEASSISTANT_SERVICES | ||||
| #include "api_pb2.h" | ||||
| #include "esphome/core/automation.h" | ||||
| #include "esphome/core/helpers.h" | ||||
| @@ -100,3 +101,4 @@ template<typename... Ts> class HomeAssistantServiceCallAction : public Action<Ts | ||||
|  | ||||
| }  // namespace esphome::api | ||||
| #endif | ||||
| #endif | ||||
|   | ||||
| @@ -23,6 +23,7 @@ CONFIG_SCHEMA = ( | ||||
|  | ||||
|  | ||||
| async def to_code(config): | ||||
|     cg.add_define("USE_API_HOMEASSISTANT_SERVICES") | ||||
|     var = await number.new_number( | ||||
|         config, | ||||
|         min_value=0, | ||||
|   | ||||
| @@ -37,6 +37,7 @@ CONFIG_SCHEMA = cv.All( | ||||
|  | ||||
|  | ||||
| async def to_code(config): | ||||
|     cg.add_define("USE_API_HOMEASSISTANT_SERVICES") | ||||
|     var = cg.new_Pvariable(config[CONF_ID]) | ||||
|     await cg.register_component(var, config) | ||||
|     await switch.register_switch(var, config) | ||||
|   | ||||
| @@ -109,6 +109,7 @@ | ||||
| #define USE_API | ||||
| #define USE_API_CLIENT_CONNECTED_TRIGGER | ||||
| #define USE_API_CLIENT_DISCONNECTED_TRIGGER | ||||
| #define USE_API_HOMEASSISTANT_SERVICES | ||||
| #define USE_API_NOISE | ||||
| #define USE_API_PLAINTEXT | ||||
| #define USE_API_SERVICES | ||||
|   | ||||
		Reference in New Issue
	
	Block a user