mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	| @@ -62,6 +62,8 @@ service APIConnection { | |||||||
|   rpc unsubscribe_bluetooth_le_advertisements(UnsubscribeBluetoothLEAdvertisementsRequest) returns (void) {} |   rpc unsubscribe_bluetooth_le_advertisements(UnsubscribeBluetoothLEAdvertisementsRequest) returns (void) {} | ||||||
|  |  | ||||||
|   rpc subscribe_voice_assistant(SubscribeVoiceAssistantRequest) returns (void) {} |   rpc subscribe_voice_assistant(SubscribeVoiceAssistantRequest) returns (void) {} | ||||||
|  |   rpc voice_assistant_get_configuration(VoiceAssistantConfigurationRequest) returns (VoiceAssistantConfigurationResponse) {} | ||||||
|  |   rpc voice_assistant_set_configuration(VoiceAssistantSetConfiguration) returns (void) {} | ||||||
|  |  | ||||||
|   rpc alarm_control_panel_command (AlarmControlPanelCommandRequest) returns (void) {} |   rpc alarm_control_panel_command (AlarmControlPanelCommandRequest) returns (void) {} | ||||||
| } | } | ||||||
| @@ -1571,6 +1573,36 @@ message VoiceAssistantAnnounceFinished { | |||||||
|   bool success = 1; |   bool success = 1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | message VoiceAssistantWakeWord { | ||||||
|  |   string id = 1; | ||||||
|  |   string wake_word = 2; | ||||||
|  |   repeated string trained_languages = 3; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | message VoiceAssistantConfigurationRequest { | ||||||
|  |   option (id) = 121; | ||||||
|  |   option (source) = SOURCE_CLIENT; | ||||||
|  |   option (ifdef) = "USE_VOICE_ASSISTANT"; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | message VoiceAssistantConfigurationResponse { | ||||||
|  |   option (id) = 122; | ||||||
|  |   option (source) = SOURCE_SERVER; | ||||||
|  |   option (ifdef) = "USE_VOICE_ASSISTANT"; | ||||||
|  |  | ||||||
|  |   repeated VoiceAssistantWakeWord available_wake_words = 1; | ||||||
|  |   repeated string active_wake_words = 2; | ||||||
|  |   uint32 max_active_wake_words = 3; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | message VoiceAssistantSetConfiguration { | ||||||
|  |   option (id) = 123; | ||||||
|  |   option (source) = SOURCE_CLIENT; | ||||||
|  |   option (ifdef) = "USE_VOICE_ASSISTANT"; | ||||||
|  |  | ||||||
|  |   repeated string active_wake_words = 1; | ||||||
|  | } | ||||||
|  |  | ||||||
| // ==================== ALARM CONTROL PANEL ==================== | // ==================== ALARM CONTROL PANEL ==================== | ||||||
| enum AlarmControlPanelState { | enum AlarmControlPanelState { | ||||||
|   ALARM_STATE_DISARMED = 0; |   ALARM_STATE_DISARMED = 0; | ||||||
|   | |||||||
| @@ -1224,6 +1224,39 @@ void APIConnection::on_voice_assistant_announce_request(const VoiceAssistantAnno | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | VoiceAssistantConfigurationResponse APIConnection::voice_assistant_get_configuration( | ||||||
|  |     const VoiceAssistantConfigurationRequest &msg) { | ||||||
|  |   VoiceAssistantConfigurationResponse resp; | ||||||
|  |   if (voice_assistant::global_voice_assistant != nullptr) { | ||||||
|  |     if (voice_assistant::global_voice_assistant->get_api_connection() != this) { | ||||||
|  |       return resp; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     auto &config = voice_assistant::global_voice_assistant->get_configuration(); | ||||||
|  |     for (auto &wake_word : config.available_wake_words) { | ||||||
|  |       VoiceAssistantWakeWord resp_wake_word; | ||||||
|  |       resp_wake_word.id = wake_word.id; | ||||||
|  |       resp_wake_word.wake_word = wake_word.wake_word; | ||||||
|  |       for (const auto &lang : wake_word.trained_languages) { | ||||||
|  |         resp_wake_word.trained_languages.push_back(lang); | ||||||
|  |       } | ||||||
|  |       resp.available_wake_words.push_back(std::move(resp_wake_word)); | ||||||
|  |     } | ||||||
|  |     resp.max_active_wake_words = config.max_active_wake_words; | ||||||
|  |   } | ||||||
|  |   return resp; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void APIConnection::voice_assistant_set_configuration(const VoiceAssistantSetConfiguration &msg) { | ||||||
|  |   if (voice_assistant::global_voice_assistant != nullptr) { | ||||||
|  |     if (voice_assistant::global_voice_assistant->get_api_connection() != this) { | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     voice_assistant::global_voice_assistant->on_set_configuration(msg.active_wake_words); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef USE_ALARM_CONTROL_PANEL | #ifdef USE_ALARM_CONTROL_PANEL | ||||||
|   | |||||||
| @@ -152,6 +152,9 @@ class APIConnection : public APIServerConnection { | |||||||
|   void on_voice_assistant_audio(const VoiceAssistantAudio &msg) override; |   void on_voice_assistant_audio(const VoiceAssistantAudio &msg) override; | ||||||
|   void on_voice_assistant_timer_event_response(const VoiceAssistantTimerEventResponse &msg) override; |   void on_voice_assistant_timer_event_response(const VoiceAssistantTimerEventResponse &msg) override; | ||||||
|   void on_voice_assistant_announce_request(const VoiceAssistantAnnounceRequest &msg) override; |   void on_voice_assistant_announce_request(const VoiceAssistantAnnounceRequest &msg) override; | ||||||
|  |   VoiceAssistantConfigurationResponse voice_assistant_get_configuration( | ||||||
|  |       const VoiceAssistantConfigurationRequest &msg) override; | ||||||
|  |   void voice_assistant_set_configuration(const VoiceAssistantSetConfiguration &msg) override; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef USE_ALARM_CONTROL_PANEL | #ifdef USE_ALARM_CONTROL_PANEL | ||||||
|   | |||||||
| @@ -7124,6 +7124,140 @@ void VoiceAssistantAnnounceFinished::dump_to(std::string &out) const { | |||||||
|   out.append("}"); |   out.append("}"); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | bool VoiceAssistantWakeWord::decode_length(uint32_t field_id, ProtoLengthDelimited value) { | ||||||
|  |   switch (field_id) { | ||||||
|  |     case 1: { | ||||||
|  |       this->id = value.as_string(); | ||||||
|  |       return true; | ||||||
|  |     } | ||||||
|  |     case 2: { | ||||||
|  |       this->wake_word = value.as_string(); | ||||||
|  |       return true; | ||||||
|  |     } | ||||||
|  |     case 3: { | ||||||
|  |       this->trained_languages.push_back(value.as_string()); | ||||||
|  |       return true; | ||||||
|  |     } | ||||||
|  |     default: | ||||||
|  |       return false; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | void VoiceAssistantWakeWord::encode(ProtoWriteBuffer buffer) const { | ||||||
|  |   buffer.encode_string(1, this->id); | ||||||
|  |   buffer.encode_string(2, this->wake_word); | ||||||
|  |   for (auto &it : this->trained_languages) { | ||||||
|  |     buffer.encode_string(3, it, true); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | #ifdef HAS_PROTO_MESSAGE_DUMP | ||||||
|  | void VoiceAssistantWakeWord::dump_to(std::string &out) const { | ||||||
|  |   __attribute__((unused)) char buffer[64]; | ||||||
|  |   out.append("VoiceAssistantWakeWord {\n"); | ||||||
|  |   out.append("  id: "); | ||||||
|  |   out.append("'").append(this->id).append("'"); | ||||||
|  |   out.append("\n"); | ||||||
|  |  | ||||||
|  |   out.append("  wake_word: "); | ||||||
|  |   out.append("'").append(this->wake_word).append("'"); | ||||||
|  |   out.append("\n"); | ||||||
|  |  | ||||||
|  |   for (const auto &it : this->trained_languages) { | ||||||
|  |     out.append("  trained_languages: "); | ||||||
|  |     out.append("'").append(it).append("'"); | ||||||
|  |     out.append("\n"); | ||||||
|  |   } | ||||||
|  |   out.append("}"); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | void VoiceAssistantConfigurationRequest::encode(ProtoWriteBuffer buffer) const {} | ||||||
|  | #ifdef HAS_PROTO_MESSAGE_DUMP | ||||||
|  | void VoiceAssistantConfigurationRequest::dump_to(std::string &out) const { | ||||||
|  |   out.append("VoiceAssistantConfigurationRequest {}"); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | bool VoiceAssistantConfigurationResponse::decode_varint(uint32_t field_id, ProtoVarInt value) { | ||||||
|  |   switch (field_id) { | ||||||
|  |     case 3: { | ||||||
|  |       this->max_active_wake_words = value.as_uint32(); | ||||||
|  |       return true; | ||||||
|  |     } | ||||||
|  |     default: | ||||||
|  |       return false; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | bool VoiceAssistantConfigurationResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) { | ||||||
|  |   switch (field_id) { | ||||||
|  |     case 1: { | ||||||
|  |       this->available_wake_words.push_back(value.as_message<VoiceAssistantWakeWord>()); | ||||||
|  |       return true; | ||||||
|  |     } | ||||||
|  |     case 2: { | ||||||
|  |       this->active_wake_words.push_back(value.as_string()); | ||||||
|  |       return true; | ||||||
|  |     } | ||||||
|  |     default: | ||||||
|  |       return false; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | void VoiceAssistantConfigurationResponse::encode(ProtoWriteBuffer buffer) const { | ||||||
|  |   for (auto &it : this->available_wake_words) { | ||||||
|  |     buffer.encode_message<VoiceAssistantWakeWord>(1, it, true); | ||||||
|  |   } | ||||||
|  |   for (auto &it : this->active_wake_words) { | ||||||
|  |     buffer.encode_string(2, it, true); | ||||||
|  |   } | ||||||
|  |   buffer.encode_uint32(3, this->max_active_wake_words); | ||||||
|  | } | ||||||
|  | #ifdef HAS_PROTO_MESSAGE_DUMP | ||||||
|  | void VoiceAssistantConfigurationResponse::dump_to(std::string &out) const { | ||||||
|  |   __attribute__((unused)) char buffer[64]; | ||||||
|  |   out.append("VoiceAssistantConfigurationResponse {\n"); | ||||||
|  |   for (const auto &it : this->available_wake_words) { | ||||||
|  |     out.append("  available_wake_words: "); | ||||||
|  |     it.dump_to(out); | ||||||
|  |     out.append("\n"); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   for (const auto &it : this->active_wake_words) { | ||||||
|  |     out.append("  active_wake_words: "); | ||||||
|  |     out.append("'").append(it).append("'"); | ||||||
|  |     out.append("\n"); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   out.append("  max_active_wake_words: "); | ||||||
|  |   sprintf(buffer, "%" PRIu32, this->max_active_wake_words); | ||||||
|  |   out.append(buffer); | ||||||
|  |   out.append("\n"); | ||||||
|  |   out.append("}"); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | bool VoiceAssistantSetConfiguration::decode_length(uint32_t field_id, ProtoLengthDelimited value) { | ||||||
|  |   switch (field_id) { | ||||||
|  |     case 1: { | ||||||
|  |       this->active_wake_words.push_back(value.as_string()); | ||||||
|  |       return true; | ||||||
|  |     } | ||||||
|  |     default: | ||||||
|  |       return false; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | void VoiceAssistantSetConfiguration::encode(ProtoWriteBuffer buffer) const { | ||||||
|  |   for (auto &it : this->active_wake_words) { | ||||||
|  |     buffer.encode_string(1, it, true); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | #ifdef HAS_PROTO_MESSAGE_DUMP | ||||||
|  | void VoiceAssistantSetConfiguration::dump_to(std::string &out) const { | ||||||
|  |   __attribute__((unused)) char buffer[64]; | ||||||
|  |   out.append("VoiceAssistantSetConfiguration {\n"); | ||||||
|  |   for (const auto &it : this->active_wake_words) { | ||||||
|  |     out.append("  active_wake_words: "); | ||||||
|  |     out.append("'").append(it).append("'"); | ||||||
|  |     out.append("\n"); | ||||||
|  |   } | ||||||
|  |   out.append("}"); | ||||||
|  | } | ||||||
|  | #endif | ||||||
| bool ListEntitiesAlarmControlPanelResponse::decode_varint(uint32_t field_id, ProtoVarInt value) { | bool ListEntitiesAlarmControlPanelResponse::decode_varint(uint32_t field_id, ProtoVarInt value) { | ||||||
|   switch (field_id) { |   switch (field_id) { | ||||||
|     case 6: { |     case 6: { | ||||||
|   | |||||||
| @@ -1849,6 +1849,53 @@ class VoiceAssistantAnnounceFinished : public ProtoMessage { | |||||||
|  protected: |  protected: | ||||||
|   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; |   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||||
| }; | }; | ||||||
|  | class VoiceAssistantWakeWord : public ProtoMessage { | ||||||
|  |  public: | ||||||
|  |   std::string id{}; | ||||||
|  |   std::string wake_word{}; | ||||||
|  |   std::vector<std::string> trained_languages{}; | ||||||
|  |   void encode(ProtoWriteBuffer buffer) const override; | ||||||
|  | #ifdef HAS_PROTO_MESSAGE_DUMP | ||||||
|  |   void dump_to(std::string &out) const override; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  protected: | ||||||
|  |   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||||
|  | }; | ||||||
|  | class VoiceAssistantConfigurationRequest : public ProtoMessage { | ||||||
|  |  public: | ||||||
|  |   void encode(ProtoWriteBuffer buffer) const override; | ||||||
|  | #ifdef HAS_PROTO_MESSAGE_DUMP | ||||||
|  |   void dump_to(std::string &out) const override; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  protected: | ||||||
|  | }; | ||||||
|  | class VoiceAssistantConfigurationResponse : public ProtoMessage { | ||||||
|  |  public: | ||||||
|  |   std::vector<VoiceAssistantWakeWord> available_wake_words{}; | ||||||
|  |   std::vector<std::string> active_wake_words{}; | ||||||
|  |   uint32_t max_active_wake_words{0}; | ||||||
|  |   void encode(ProtoWriteBuffer buffer) const override; | ||||||
|  | #ifdef HAS_PROTO_MESSAGE_DUMP | ||||||
|  |   void dump_to(std::string &out) const override; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  protected: | ||||||
|  |   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||||
|  |   bool decode_varint(uint32_t field_id, ProtoVarInt value) override; | ||||||
|  | }; | ||||||
|  | class VoiceAssistantSetConfiguration : public ProtoMessage { | ||||||
|  |  public: | ||||||
|  |   std::vector<std::string> active_wake_words{}; | ||||||
|  |   void encode(ProtoWriteBuffer buffer) const override; | ||||||
|  | #ifdef HAS_PROTO_MESSAGE_DUMP | ||||||
|  |   void dump_to(std::string &out) const override; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  protected: | ||||||
|  |   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||||
|  | }; | ||||||
| class ListEntitiesAlarmControlPanelResponse : public ProtoMessage { | class ListEntitiesAlarmControlPanelResponse : public ProtoMessage { | ||||||
|  public: |  public: | ||||||
|   std::string object_id{}; |   std::string object_id{}; | ||||||
|   | |||||||
| @@ -496,6 +496,19 @@ bool APIServerConnectionBase::send_voice_assistant_announce_finished(const Voice | |||||||
|   return this->send_message_<VoiceAssistantAnnounceFinished>(msg, 120); |   return this->send_message_<VoiceAssistantAnnounceFinished>(msg, 120); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  | #endif | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  | bool APIServerConnectionBase::send_voice_assistant_configuration_response( | ||||||
|  |     const VoiceAssistantConfigurationResponse &msg) { | ||||||
|  | #ifdef HAS_PROTO_MESSAGE_DUMP | ||||||
|  |   ESP_LOGVV(TAG, "send_voice_assistant_configuration_response: %s", msg.dump().c_str()); | ||||||
|  | #endif | ||||||
|  |   return this->send_message_<VoiceAssistantConfigurationResponse>(msg, 122); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  | #endif | ||||||
| #ifdef USE_ALARM_CONTROL_PANEL | #ifdef USE_ALARM_CONTROL_PANEL | ||||||
| bool APIServerConnectionBase::send_list_entities_alarm_control_panel_response( | bool APIServerConnectionBase::send_list_entities_alarm_control_panel_response( | ||||||
|     const ListEntitiesAlarmControlPanelResponse &msg) { |     const ListEntitiesAlarmControlPanelResponse &msg) { | ||||||
| @@ -1156,6 +1169,28 @@ bool APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, | |||||||
|       ESP_LOGVV(TAG, "on_voice_assistant_announce_request: %s", msg.dump().c_str()); |       ESP_LOGVV(TAG, "on_voice_assistant_announce_request: %s", msg.dump().c_str()); | ||||||
| #endif | #endif | ||||||
|       this->on_voice_assistant_announce_request(msg); |       this->on_voice_assistant_announce_request(msg); | ||||||
|  | #endif | ||||||
|  |       break; | ||||||
|  |     } | ||||||
|  |     case 121: { | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  |       VoiceAssistantConfigurationRequest msg; | ||||||
|  |       msg.decode(msg_data, msg_size); | ||||||
|  | #ifdef HAS_PROTO_MESSAGE_DUMP | ||||||
|  |       ESP_LOGVV(TAG, "on_voice_assistant_configuration_request: %s", msg.dump().c_str()); | ||||||
|  | #endif | ||||||
|  |       this->on_voice_assistant_configuration_request(msg); | ||||||
|  | #endif | ||||||
|  |       break; | ||||||
|  |     } | ||||||
|  |     case 123: { | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  |       VoiceAssistantSetConfiguration msg; | ||||||
|  |       msg.decode(msg_data, msg_size); | ||||||
|  | #ifdef HAS_PROTO_MESSAGE_DUMP | ||||||
|  |       ESP_LOGVV(TAG, "on_voice_assistant_set_configuration: %s", msg.dump().c_str()); | ||||||
|  | #endif | ||||||
|  |       this->on_voice_assistant_set_configuration(msg); | ||||||
| #endif | #endif | ||||||
|       break; |       break; | ||||||
|     } |     } | ||||||
| @@ -1646,6 +1681,35 @@ void APIServerConnection::on_subscribe_voice_assistant_request(const SubscribeVo | |||||||
|   this->subscribe_voice_assistant(msg); |   this->subscribe_voice_assistant(msg); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  | void APIServerConnection::on_voice_assistant_configuration_request(const VoiceAssistantConfigurationRequest &msg) { | ||||||
|  |   if (!this->is_connection_setup()) { | ||||||
|  |     this->on_no_setup_connection(); | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  |   if (!this->is_authenticated()) { | ||||||
|  |     this->on_unauthenticated_access(); | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  |   VoiceAssistantConfigurationResponse ret = this->voice_assistant_get_configuration(msg); | ||||||
|  |   if (!this->send_voice_assistant_configuration_response(ret)) { | ||||||
|  |     this->on_fatal_error(); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  | void APIServerConnection::on_voice_assistant_set_configuration(const VoiceAssistantSetConfiguration &msg) { | ||||||
|  |   if (!this->is_connection_setup()) { | ||||||
|  |     this->on_no_setup_connection(); | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  |   if (!this->is_authenticated()) { | ||||||
|  |     this->on_unauthenticated_access(); | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  |   this->voice_assistant_set_configuration(msg); | ||||||
|  | } | ||||||
|  | #endif | ||||||
| #ifdef USE_ALARM_CONTROL_PANEL | #ifdef USE_ALARM_CONTROL_PANEL | ||||||
| void APIServerConnection::on_alarm_control_panel_command_request(const AlarmControlPanelCommandRequest &msg) { | void APIServerConnection::on_alarm_control_panel_command_request(const AlarmControlPanelCommandRequest &msg) { | ||||||
|   if (!this->is_connection_setup()) { |   if (!this->is_connection_setup()) { | ||||||
|   | |||||||
| @@ -253,6 +253,15 @@ class APIServerConnectionBase : public ProtoService { | |||||||
| #ifdef USE_VOICE_ASSISTANT | #ifdef USE_VOICE_ASSISTANT | ||||||
|   bool send_voice_assistant_announce_finished(const VoiceAssistantAnnounceFinished &msg); |   bool send_voice_assistant_announce_finished(const VoiceAssistantAnnounceFinished &msg); | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  |   virtual void on_voice_assistant_configuration_request(const VoiceAssistantConfigurationRequest &value){}; | ||||||
|  | #endif | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  |   bool send_voice_assistant_configuration_response(const VoiceAssistantConfigurationResponse &msg); | ||||||
|  | #endif | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  |   virtual void on_voice_assistant_set_configuration(const VoiceAssistantSetConfiguration &value){}; | ||||||
|  | #endif | ||||||
| #ifdef USE_ALARM_CONTROL_PANEL | #ifdef USE_ALARM_CONTROL_PANEL | ||||||
|   bool send_list_entities_alarm_control_panel_response(const ListEntitiesAlarmControlPanelResponse &msg); |   bool send_list_entities_alarm_control_panel_response(const ListEntitiesAlarmControlPanelResponse &msg); | ||||||
| #endif | #endif | ||||||
| @@ -425,6 +434,13 @@ class APIServerConnection : public APIServerConnectionBase { | |||||||
| #ifdef USE_VOICE_ASSISTANT | #ifdef USE_VOICE_ASSISTANT | ||||||
|   virtual void subscribe_voice_assistant(const SubscribeVoiceAssistantRequest &msg) = 0; |   virtual void subscribe_voice_assistant(const SubscribeVoiceAssistantRequest &msg) = 0; | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  |   virtual VoiceAssistantConfigurationResponse voice_assistant_get_configuration( | ||||||
|  |       const VoiceAssistantConfigurationRequest &msg) = 0; | ||||||
|  | #endif | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  |   virtual void voice_assistant_set_configuration(const VoiceAssistantSetConfiguration &msg) = 0; | ||||||
|  | #endif | ||||||
| #ifdef USE_ALARM_CONTROL_PANEL | #ifdef USE_ALARM_CONTROL_PANEL | ||||||
|   virtual void alarm_control_panel_command(const AlarmControlPanelCommandRequest &msg) = 0; |   virtual void alarm_control_panel_command(const AlarmControlPanelCommandRequest &msg) = 0; | ||||||
| #endif | #endif | ||||||
| @@ -526,6 +542,12 @@ class APIServerConnection : public APIServerConnectionBase { | |||||||
| #ifdef USE_VOICE_ASSISTANT | #ifdef USE_VOICE_ASSISTANT | ||||||
|   void on_subscribe_voice_assistant_request(const SubscribeVoiceAssistantRequest &msg) override; |   void on_subscribe_voice_assistant_request(const SubscribeVoiceAssistantRequest &msg) override; | ||||||
| #endif | #endif | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  |   void on_voice_assistant_configuration_request(const VoiceAssistantConfigurationRequest &msg) override; | ||||||
|  | #endif | ||||||
|  | #ifdef USE_VOICE_ASSISTANT | ||||||
|  |   void on_voice_assistant_set_configuration(const VoiceAssistantSetConfiguration &msg) override; | ||||||
|  | #endif | ||||||
| #ifdef USE_ALARM_CONTROL_PANEL | #ifdef USE_ALARM_CONTROL_PANEL | ||||||
|   void on_alarm_control_panel_command_request(const AlarmControlPanelCommandRequest &msg) override; |   void on_alarm_control_panel_command_request(const AlarmControlPanelCommandRequest &msg) override; | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -77,6 +77,18 @@ struct Timer { | |||||||
|   } |   } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | struct WakeWord { | ||||||
|  |   std::string id; | ||||||
|  |   std::string wake_word; | ||||||
|  |   std::vector<std::string> trained_languages; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | struct Configuration { | ||||||
|  |   std::vector<WakeWord> available_wake_words; | ||||||
|  |   std::vector<std::string> active_wake_words; | ||||||
|  |   uint32_t max_active_wake_words; | ||||||
|  | }; | ||||||
|  |  | ||||||
| class VoiceAssistant : public Component { | class VoiceAssistant : public Component { | ||||||
|  public: |  public: | ||||||
|   void setup() override; |   void setup() override; | ||||||
| @@ -133,6 +145,8 @@ class VoiceAssistant : public Component { | |||||||
|   void on_audio(const api::VoiceAssistantAudio &msg); |   void on_audio(const api::VoiceAssistantAudio &msg); | ||||||
|   void on_timer_event(const api::VoiceAssistantTimerEventResponse &msg); |   void on_timer_event(const api::VoiceAssistantTimerEventResponse &msg); | ||||||
|   void on_announce(const api::VoiceAssistantAnnounceRequest &msg); |   void on_announce(const api::VoiceAssistantAnnounceRequest &msg); | ||||||
|  |   void on_set_configuration(const std::vector<std::string> &active_wake_words){}; | ||||||
|  |   const Configuration &get_configuration() { return this->config_; }; | ||||||
|  |  | ||||||
|   bool is_running() const { return this->state_ != State::IDLE; } |   bool is_running() const { return this->state_ != State::IDLE; } | ||||||
|   void set_continuous(bool continuous) { this->continuous_ = continuous; } |   void set_continuous(bool continuous) { this->continuous_ = continuous; } | ||||||
| @@ -279,6 +293,8 @@ class VoiceAssistant : public Component { | |||||||
|   AudioMode audio_mode_{AUDIO_MODE_UDP}; |   AudioMode audio_mode_{AUDIO_MODE_UDP}; | ||||||
|   bool udp_socket_running_{false}; |   bool udp_socket_running_{false}; | ||||||
|   bool start_udp_socket_(); |   bool start_udp_socket_(); | ||||||
|  |  | ||||||
|  |   Configuration config_{}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| template<typename... Ts> class StartAction : public Action<Ts...>, public Parented<VoiceAssistant> { | template<typename... Ts> class StartAction : public Action<Ts...>, public Parented<VoiceAssistant> { | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| """Constants used by esphome.""" | """Constants used by esphome.""" | ||||||
|  |  | ||||||
| __version__ = "2024.9.0b3" | __version__ = "2024.9.0b4" | ||||||
|  |  | ||||||
| ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" | ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" | ||||||
| VALID_SUBSTITUTIONS_CHARACTERS = ( | VALID_SUBSTITUTIONS_CHARACTERS = ( | ||||||
|   | |||||||
| @@ -100,9 +100,6 @@ def valid_include(value): | |||||||
| def valid_project_name(value: str): | def valid_project_name(value: str): | ||||||
|     if value.count(".") != 1: |     if value.count(".") != 1: | ||||||
|         raise cv.Invalid("project name needs to have a namespace") |         raise cv.Invalid("project name needs to have a namespace") | ||||||
|  |  | ||||||
|     value = value.replace(" ", "_") |  | ||||||
|  |  | ||||||
|     return value |     return value | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user