mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	[api] Add timezone support to GetTimeResponse for automatic timezone synchronization (#10661)
This commit is contained in:
		| @@ -818,6 +818,7 @@ message GetTimeResponse { | ||||
|   option (no_delay) = true; | ||||
|  | ||||
|   fixed32 epoch_seconds = 1; | ||||
|   string timezone = 2; | ||||
| } | ||||
|  | ||||
| // ==================== USER-DEFINES SERVICES ==================== | ||||
|   | ||||
| @@ -1070,8 +1070,14 @@ void APIConnection::camera_image(const CameraImageRequest &msg) { | ||||
|  | ||||
| #ifdef USE_HOMEASSISTANT_TIME | ||||
| void APIConnection::on_get_time_response(const GetTimeResponse &value) { | ||||
|   if (homeassistant::global_homeassistant_time != nullptr) | ||||
|   if (homeassistant::global_homeassistant_time != nullptr) { | ||||
|     homeassistant::global_homeassistant_time->set_epoch_time(value.epoch_seconds); | ||||
| #ifdef USE_TIME_TIMEZONE | ||||
|     if (!value.timezone.empty() && value.timezone != homeassistant::global_homeassistant_time->get_timezone()) { | ||||
|       homeassistant::global_homeassistant_time->set_timezone(value.timezone); | ||||
|     } | ||||
| #endif | ||||
|   } | ||||
| } | ||||
| #endif | ||||
|  | ||||
|   | ||||
| @@ -901,6 +901,16 @@ bool HomeAssistantStateResponse::decode_length(uint32_t field_id, ProtoLengthDel | ||||
|   return true; | ||||
| } | ||||
| #endif | ||||
| bool GetTimeResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) { | ||||
|   switch (field_id) { | ||||
|     case 2: | ||||
|       this->timezone = value.as_string(); | ||||
|       break; | ||||
|     default: | ||||
|       return false; | ||||
|   } | ||||
|   return true; | ||||
| } | ||||
| bool GetTimeResponse::decode_32bit(uint32_t field_id, Proto32Bit value) { | ||||
|   switch (field_id) { | ||||
|     case 1: | ||||
| @@ -911,8 +921,14 @@ bool GetTimeResponse::decode_32bit(uint32_t field_id, Proto32Bit value) { | ||||
|   } | ||||
|   return true; | ||||
| } | ||||
| void GetTimeResponse::encode(ProtoWriteBuffer buffer) const { buffer.encode_fixed32(1, this->epoch_seconds); } | ||||
| void GetTimeResponse::calculate_size(ProtoSize &size) const { size.add_fixed32(1, this->epoch_seconds); } | ||||
| void GetTimeResponse::encode(ProtoWriteBuffer buffer) const { | ||||
|   buffer.encode_fixed32(1, this->epoch_seconds); | ||||
|   buffer.encode_string(2, this->timezone_ref_); | ||||
| } | ||||
| void GetTimeResponse::calculate_size(ProtoSize &size) const { | ||||
|   size.add_fixed32(1, this->epoch_seconds); | ||||
|   size.add_length(1, this->timezone_ref_.size()); | ||||
| } | ||||
| #ifdef USE_API_SERVICES | ||||
| void ListEntitiesServicesArgument::encode(ProtoWriteBuffer buffer) const { | ||||
|   buffer.encode_string(1, this->name_ref_); | ||||
|   | ||||
| @@ -1174,11 +1174,14 @@ class GetTimeRequest final : public ProtoMessage { | ||||
| class GetTimeResponse final : public ProtoDecodableMessage { | ||||
|  public: | ||||
|   static constexpr uint8_t MESSAGE_TYPE = 37; | ||||
|   static constexpr uint8_t ESTIMATED_SIZE = 5; | ||||
|   static constexpr uint8_t ESTIMATED_SIZE = 14; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
|   const char *message_name() const override { return "get_time_response"; } | ||||
| #endif | ||||
|   uint32_t epoch_seconds{0}; | ||||
|   std::string timezone{}; | ||||
|   StringRef timezone_ref_{}; | ||||
|   void set_timezone(const StringRef &ref) { this->timezone_ref_ = ref; } | ||||
|   void encode(ProtoWriteBuffer buffer) const override; | ||||
|   void calculate_size(ProtoSize &size) const override; | ||||
| #ifdef HAS_PROTO_MESSAGE_DUMP | ||||
| @@ -1187,6 +1190,7 @@ class GetTimeResponse final : public ProtoDecodableMessage { | ||||
|  | ||||
|  protected: | ||||
|   bool decode_32bit(uint32_t field_id, Proto32Bit value) override; | ||||
|   bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; | ||||
| }; | ||||
| #ifdef USE_API_SERVICES | ||||
| class ListEntitiesServicesArgument final : public ProtoMessage { | ||||
|   | ||||
| @@ -1110,7 +1110,17 @@ void HomeAssistantStateResponse::dump_to(std::string &out) const { | ||||
| } | ||||
| #endif | ||||
| 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 { | ||||
|   MessageDumpHelper helper(out, "GetTimeResponse"); | ||||
|   dump_field(out, "epoch_seconds", this->epoch_seconds); | ||||
|   out.append("  timezone: "); | ||||
|   if (!this->timezone_ref_.empty()) { | ||||
|     out.append("'").append(this->timezone_ref_.c_str()).append("'"); | ||||
|   } else { | ||||
|     out.append("'").append(this->timezone).append("'"); | ||||
|   } | ||||
|   out.append("\n"); | ||||
| } | ||||
| #ifdef USE_API_SERVICES | ||||
| void ListEntitiesServicesArgument::dump_to(std::string &out) const { | ||||
|   MessageDumpHelper helper(out, "ListEntitiesServicesArgument"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user