esphome 2025.7.1__py3-none-any.whl → 2025.7.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of esphome might be problematic. Click here for more details.

@@ -16,6 +16,9 @@ template<typename... X> class TemplatableStringValue : public TemplatableValue<s
16
16
  template<typename T> static std::string value_to_string(T &&val) { return to_string(std::forward<T>(val)); }
17
17
 
18
18
  // Overloads for string types - needed because std::to_string doesn't support them
19
+ static std::string value_to_string(char *val) {
20
+ return val ? std::string(val) : std::string();
21
+ } // For lambdas returning char* (e.g., itoa)
19
22
  static std::string value_to_string(const char *val) { return std::string(val); } // For lambdas returning .c_str()
20
23
  static std::string value_to_string(const std::string &val) { return val; }
21
24
  static std::string value_to_string(std::string &&val) { return std::move(val); }
@@ -1,3 +1,5 @@
1
+ import logging
2
+
1
3
  from esphome import automation, pins
2
4
  import esphome.codegen as cg
3
5
  from esphome.components import i2c
@@ -8,6 +10,7 @@ from esphome.const import (
8
10
  CONF_CONTRAST,
9
11
  CONF_DATA_PINS,
10
12
  CONF_FREQUENCY,
13
+ CONF_I2C,
11
14
  CONF_I2C_ID,
12
15
  CONF_ID,
13
16
  CONF_PIN,
@@ -20,6 +23,9 @@ from esphome.const import (
20
23
  )
21
24
  from esphome.core import CORE
22
25
  from esphome.core.entity_helpers import setup_entity
26
+ import esphome.final_validate as fv
27
+
28
+ _LOGGER = logging.getLogger(__name__)
23
29
 
24
30
  DEPENDENCIES = ["esp32"]
25
31
 
@@ -250,6 +256,22 @@ CONFIG_SCHEMA = cv.All(
250
256
  cv.has_exactly_one_key(CONF_I2C_PINS, CONF_I2C_ID),
251
257
  )
252
258
 
259
+
260
+ def _final_validate(config):
261
+ if CONF_I2C_PINS not in config:
262
+ return
263
+ fconf = fv.full_config.get()
264
+ if fconf.get(CONF_I2C):
265
+ raise cv.Invalid(
266
+ "The `i2c_pins:` config option is incompatible with an dedicated `i2c:` block, use `i2c_id` instead"
267
+ )
268
+ _LOGGER.warning(
269
+ "The `i2c_pins:` config option is deprecated. Use `i2c_id:` with a dedicated `i2c:` definition instead."
270
+ )
271
+
272
+
273
+ FINAL_VALIDATE_SCHEMA = _final_validate
274
+
253
275
  SETTERS = {
254
276
  # pin assignment
255
277
  CONF_DATA_PINS: "set_data_pins",
@@ -29,7 +29,21 @@ CONFIG_SCHEMA = (
29
29
  .extend(
30
30
  {
31
31
  cv.Required(CONF_PIN): pins.gpio_input_pin_schema,
32
- cv.Optional(CONF_USE_INTERRUPT, default=True): cv.boolean,
32
+ # Interrupts are disabled by default for bk72xx, ln882x, and rtl87xx platforms
33
+ # due to hardware limitations or lack of reliable interrupt support. This ensures
34
+ # stable operation on these platforms. Future maintainers should verify platform
35
+ # capabilities before changing this default behavior.
36
+ cv.SplitDefault(
37
+ CONF_USE_INTERRUPT,
38
+ bk72xx=False,
39
+ esp32=True,
40
+ esp8266=True,
41
+ host=True,
42
+ ln882x=False,
43
+ nrf52=True,
44
+ rp2040=True,
45
+ rtl87xx=False,
46
+ ): cv.boolean,
33
47
  cv.Optional(CONF_INTERRUPT_TYPE, default="ANY"): cv.enum(
34
48
  INTERRUPT_TYPES, upper=True
35
49
  ),
@@ -183,7 +183,7 @@ def validate_local_no_higher_than_global(value):
183
183
  Logger = logger_ns.class_("Logger", cg.Component)
184
184
  LoggerMessageTrigger = logger_ns.class_(
185
185
  "LoggerMessageTrigger",
186
- automation.Trigger.template(cg.int_, cg.const_char_ptr, cg.const_char_ptr),
186
+ automation.Trigger.template(cg.uint8, cg.const_char_ptr, cg.const_char_ptr),
187
187
  )
188
188
 
189
189
  CONF_ESP8266_STORE_LOG_STRINGS_IN_FLASH = "esp8266_store_log_strings_in_flash"
@@ -368,7 +368,7 @@ async def to_code(config):
368
368
  await automation.build_automation(
369
369
  trigger,
370
370
  [
371
- (cg.int_, "level"),
371
+ (cg.uint8, "level"),
372
372
  (cg.const_char_ptr, "tag"),
373
373
  (cg.const_char_ptr, "message"),
374
374
  ],
@@ -192,7 +192,7 @@ class WidgetType:
192
192
 
193
193
  class NumberType(WidgetType):
194
194
  def get_max(self, config: dict):
195
- return int(config[CONF_MAX_VALUE] or 100)
195
+ return int(config.get(CONF_MAX_VALUE, 100))
196
196
 
197
197
  def get_min(self, config: dict):
198
- return int(config[CONF_MIN_VALUE] or 0)
198
+ return int(config.get(CONF_MIN_VALUE, 0))
@@ -14,6 +14,7 @@ from esphome.const import (
14
14
  CONF_VALUE,
15
15
  CONF_WIDTH,
16
16
  )
17
+ from esphome.cpp_generator import IntLiteral
17
18
 
18
19
  from ..automation import action_to_code
19
20
  from ..defines import (
@@ -188,6 +189,8 @@ class MeterType(WidgetType):
188
189
  rotation = 90 + (360 - scale_conf[CONF_ANGLE_RANGE]) / 2
189
190
  if CONF_ROTATION in scale_conf:
190
191
  rotation = await lv_angle.process(scale_conf[CONF_ROTATION])
192
+ if isinstance(rotation, IntLiteral):
193
+ rotation = int(str(rotation)) // 10
191
194
  with LocalVariable(
192
195
  "meter_var", "lv_meter_scale_t", lv_expr.meter_add_scale(var)
193
196
  ) as meter_var:
@@ -200,7 +200,7 @@ AudioPipelineState AudioPipeline::process_state() {
200
200
  if ((this->read_task_handle_ != nullptr) || (this->decode_task_handle_ != nullptr)) {
201
201
  this->delete_tasks_();
202
202
  if (this->hard_stop_) {
203
- // Stop command was sent, so immediately end of the playback
203
+ // Stop command was sent, so immediately end the playback
204
204
  this->speaker_->stop();
205
205
  this->hard_stop_ = false;
206
206
  } else {
@@ -210,13 +210,25 @@ AudioPipelineState AudioPipeline::process_state() {
210
210
  }
211
211
  }
212
212
  this->is_playing_ = false;
213
- return AudioPipelineState::STOPPED;
213
+ if (!this->speaker_->is_running()) {
214
+ return AudioPipelineState::STOPPED;
215
+ } else {
216
+ this->is_finishing_ = true;
217
+ }
214
218
  }
215
219
 
216
220
  if (this->pause_state_) {
217
221
  return AudioPipelineState::PAUSED;
218
222
  }
219
223
 
224
+ if (this->is_finishing_) {
225
+ if (!this->speaker_->is_running()) {
226
+ this->is_finishing_ = false;
227
+ } else {
228
+ return AudioPipelineState::PLAYING;
229
+ }
230
+ }
231
+
220
232
  if ((this->read_task_handle_ == nullptr) && (this->decode_task_handle_ == nullptr)) {
221
233
  // No tasks are running, so the pipeline is stopped.
222
234
  xEventGroupClearBits(this->event_group_, EventGroupBits::PIPELINE_COMMAND_STOP);
@@ -114,6 +114,7 @@ class AudioPipeline {
114
114
 
115
115
  bool hard_stop_{false};
116
116
  bool is_playing_{false};
117
+ bool is_finishing_{false};
117
118
  bool pause_state_{false};
118
119
  bool task_stack_in_psram_;
119
120
 
@@ -35,6 +35,27 @@ void VoiceAssistant::setup() {
35
35
  temp_ring_buffer->write((void *) data.data(), data.size());
36
36
  }
37
37
  });
38
+
39
+ #ifdef USE_MEDIA_PLAYER
40
+ if (this->media_player_ != nullptr) {
41
+ this->media_player_->add_on_state_callback([this]() {
42
+ switch (this->media_player_->state) {
43
+ case media_player::MediaPlayerState::MEDIA_PLAYER_STATE_ANNOUNCING:
44
+ if (this->media_player_response_state_ == MediaPlayerResponseState::URL_SENT) {
45
+ // State changed to announcing after receiving the url
46
+ this->media_player_response_state_ = MediaPlayerResponseState::PLAYING;
47
+ }
48
+ break;
49
+ default:
50
+ if (this->media_player_response_state_ == MediaPlayerResponseState::PLAYING) {
51
+ // No longer announcing the TTS response
52
+ this->media_player_response_state_ = MediaPlayerResponseState::FINISHED;
53
+ }
54
+ break;
55
+ }
56
+ });
57
+ }
58
+ #endif
38
59
  }
39
60
 
40
61
  float VoiceAssistant::get_setup_priority() const { return setup_priority::AFTER_CONNECTION; }
@@ -223,6 +244,13 @@ void VoiceAssistant::loop() {
223
244
  msg.wake_word_phrase = this->wake_word_;
224
245
  this->wake_word_ = "";
225
246
 
247
+ // Reset media player state tracking
248
+ #ifdef USE_MEDIA_PLAYER
249
+ if (this->media_player_ != nullptr) {
250
+ this->media_player_response_state_ = MediaPlayerResponseState::IDLE;
251
+ }
252
+ #endif
253
+
226
254
  if (this->api_client_ == nullptr || !this->api_client_->send_message(msg)) {
227
255
  ESP_LOGW(TAG, "Could not request start");
228
256
  this->error_trigger_->trigger("not-connected", "Could not request start");
@@ -314,17 +342,10 @@ void VoiceAssistant::loop() {
314
342
  #endif
315
343
  #ifdef USE_MEDIA_PLAYER
316
344
  if (this->media_player_ != nullptr) {
317
- playing = (this->media_player_->state == media_player::MediaPlayerState::MEDIA_PLAYER_STATE_ANNOUNCING);
318
-
319
- if (playing && this->media_player_wait_for_announcement_start_) {
320
- // Announcement has started playing, wait for it to finish
321
- this->media_player_wait_for_announcement_start_ = false;
322
- this->media_player_wait_for_announcement_end_ = true;
323
- }
345
+ playing = (this->media_player_response_state_ == MediaPlayerResponseState::PLAYING);
324
346
 
325
- if (!playing && this->media_player_wait_for_announcement_end_) {
326
- // Announcement has finished playing
327
- this->media_player_wait_for_announcement_end_ = false;
347
+ if (this->media_player_response_state_ == MediaPlayerResponseState::FINISHED) {
348
+ this->media_player_response_state_ = MediaPlayerResponseState::IDLE;
328
349
  this->cancel_timeout("playing");
329
350
  ESP_LOGD(TAG, "Announcement finished playing");
330
351
  this->set_state_(State::RESPONSE_FINISHED, State::RESPONSE_FINISHED);
@@ -555,7 +576,7 @@ void VoiceAssistant::request_stop() {
555
576
  break;
556
577
  case State::AWAITING_RESPONSE:
557
578
  this->signal_stop_();
558
- // Fallthrough intended to stop a streaming TTS announcement that has potentially started
579
+ break;
559
580
  case State::STREAMING_RESPONSE:
560
581
  #ifdef USE_MEDIA_PLAYER
561
582
  // Stop any ongoing media player announcement
@@ -565,6 +586,10 @@ void VoiceAssistant::request_stop() {
565
586
  .set_announcement(true)
566
587
  .perform();
567
588
  }
589
+ if (this->started_streaming_tts_) {
590
+ // Haven't reached the TTS_END stage, so send the stop signal to HA.
591
+ this->signal_stop_();
592
+ }
568
593
  #endif
569
594
  break;
570
595
  case State::RESPONSE_FINISHED:
@@ -648,13 +673,16 @@ void VoiceAssistant::on_event(const api::VoiceAssistantEventResponse &msg) {
648
673
  if (this->media_player_ != nullptr) {
649
674
  for (const auto &arg : msg.data) {
650
675
  if ((arg.name == "tts_start_streaming") && (arg.value == "1") && !this->tts_response_url_.empty()) {
676
+ this->media_player_response_state_ = MediaPlayerResponseState::URL_SENT;
677
+
651
678
  this->media_player_->make_call().set_media_url(this->tts_response_url_).set_announcement(true).perform();
652
679
 
653
- this->media_player_wait_for_announcement_start_ = true;
654
- this->media_player_wait_for_announcement_end_ = false;
655
680
  this->started_streaming_tts_ = true;
681
+ this->start_playback_timeout_();
682
+
656
683
  tts_url_for_trigger = this->tts_response_url_;
657
684
  this->tts_response_url_.clear(); // Reset streaming URL
685
+ this->set_state_(State::STREAMING_RESPONSE, State::STREAMING_RESPONSE);
658
686
  }
659
687
  }
660
688
  }
@@ -713,18 +741,22 @@ void VoiceAssistant::on_event(const api::VoiceAssistantEventResponse &msg) {
713
741
  this->defer([this, url]() {
714
742
  #ifdef USE_MEDIA_PLAYER
715
743
  if ((this->media_player_ != nullptr) && (!this->started_streaming_tts_)) {
744
+ this->media_player_response_state_ = MediaPlayerResponseState::URL_SENT;
745
+
716
746
  this->media_player_->make_call().set_media_url(url).set_announcement(true).perform();
717
747
 
718
- this->media_player_wait_for_announcement_start_ = true;
719
- this->media_player_wait_for_announcement_end_ = false;
720
- // Start the playback timeout, as the media player state isn't immediately updated
721
748
  this->start_playback_timeout_();
722
749
  }
750
+ this->started_streaming_tts_ = false; // Helps indicate reaching the TTS_END stage
723
751
  #endif
724
752
  this->tts_end_trigger_->trigger(url);
725
753
  });
726
754
  State new_state = this->local_output_ ? State::STREAMING_RESPONSE : State::IDLE;
727
- this->set_state_(new_state, new_state);
755
+ if (new_state != this->state_) {
756
+ // Don't needlessly change the state. The intent progress stage may have already changed the state to streaming
757
+ // response.
758
+ this->set_state_(new_state, new_state);
759
+ }
728
760
  break;
729
761
  }
730
762
  case api::enums::VOICE_ASSISTANT_RUN_END: {
@@ -875,6 +907,9 @@ void VoiceAssistant::on_announce(const api::VoiceAssistantAnnounceRequest &msg)
875
907
  #ifdef USE_MEDIA_PLAYER
876
908
  if (this->media_player_ != nullptr) {
877
909
  this->tts_start_trigger_->trigger(msg.text);
910
+
911
+ this->media_player_response_state_ = MediaPlayerResponseState::URL_SENT;
912
+
878
913
  if (!msg.preannounce_media_id.empty()) {
879
914
  this->media_player_->make_call().set_media_url(msg.preannounce_media_id).set_announcement(true).perform();
880
915
  }
@@ -886,9 +921,6 @@ void VoiceAssistant::on_announce(const api::VoiceAssistantAnnounceRequest &msg)
886
921
  .perform();
887
922
  this->continue_conversation_ = msg.start_conversation;
888
923
 
889
- this->media_player_wait_for_announcement_start_ = true;
890
- this->media_player_wait_for_announcement_end_ = false;
891
- // Start the playback timeout, as the media player state isn't immediately updated
892
924
  this->start_playback_timeout_();
893
925
 
894
926
  if (this->continuous_) {
@@ -90,6 +90,15 @@ struct Configuration {
90
90
  uint32_t max_active_wake_words;
91
91
  };
92
92
 
93
+ #ifdef USE_MEDIA_PLAYER
94
+ enum class MediaPlayerResponseState {
95
+ IDLE,
96
+ URL_SENT,
97
+ PLAYING,
98
+ FINISHED,
99
+ };
100
+ #endif
101
+
93
102
  class VoiceAssistant : public Component {
94
103
  public:
95
104
  VoiceAssistant();
@@ -272,8 +281,8 @@ class VoiceAssistant : public Component {
272
281
  media_player::MediaPlayer *media_player_{nullptr};
273
282
  std::string tts_response_url_{""};
274
283
  bool started_streaming_tts_{false};
275
- bool media_player_wait_for_announcement_start_{false};
276
- bool media_player_wait_for_announcement_end_{false};
284
+
285
+ MediaPlayerResponseState media_player_response_state_{MediaPlayerResponseState::IDLE};
277
286
  #endif
278
287
 
279
288
  bool local_output_{false};
@@ -1620,7 +1620,9 @@ void WebServer::handle_event_request(AsyncWebServerRequest *request, const UrlMa
1620
1620
  request->send(404);
1621
1621
  }
1622
1622
 
1623
- static std::string get_event_type(event::Event *event) { return event->last_event_type ? *event->last_event_type : ""; }
1623
+ static std::string get_event_type(event::Event *event) {
1624
+ return (event && event->last_event_type) ? *event->last_event_type : "";
1625
+ }
1624
1626
 
1625
1627
  std::string WebServer::event_state_json_generator(WebServer *web_server, void *source) {
1626
1628
  auto *event = static_cast<event::Event *>(source);
@@ -8,6 +8,7 @@
8
8
  #include "esphome/core/log.h"
9
9
  #include "esphome/core/time.h"
10
10
  #include "esphome/components/network/util.h"
11
+ #include "esphome/core/helpers.h"
11
12
 
12
13
  #include <esp_wireguard.h>
13
14
  #include <esp_wireguard_err.h>
@@ -42,7 +43,10 @@ void Wireguard::setup() {
42
43
 
43
44
  this->publish_enabled_state();
44
45
 
45
- this->wg_initialized_ = esp_wireguard_init(&(this->wg_config_), &(this->wg_ctx_));
46
+ {
47
+ LwIPLock lock;
48
+ this->wg_initialized_ = esp_wireguard_init(&(this->wg_config_), &(this->wg_ctx_));
49
+ }
46
50
 
47
51
  if (this->wg_initialized_ == ESP_OK) {
48
52
  ESP_LOGI(TAG, "Initialized");
@@ -249,7 +253,10 @@ void Wireguard::start_connection_() {
249
253
  }
250
254
 
251
255
  ESP_LOGD(TAG, "Starting connection");
252
- this->wg_connected_ = esp_wireguard_connect(&(this->wg_ctx_));
256
+ {
257
+ LwIPLock lock;
258
+ this->wg_connected_ = esp_wireguard_connect(&(this->wg_ctx_));
259
+ }
253
260
 
254
261
  if (this->wg_connected_ == ESP_OK) {
255
262
  ESP_LOGI(TAG, "Connection started");
@@ -280,7 +287,10 @@ void Wireguard::start_connection_() {
280
287
  void Wireguard::stop_connection_() {
281
288
  if (this->wg_initialized_ == ESP_OK && this->wg_connected_ == ESP_OK) {
282
289
  ESP_LOGD(TAG, "Stopping connection");
283
- esp_wireguard_disconnect(&(this->wg_ctx_));
290
+ {
291
+ LwIPLock lock;
292
+ esp_wireguard_disconnect(&(this->wg_ctx_));
293
+ }
284
294
  this->wg_connected_ = ESP_FAIL;
285
295
  }
286
296
  }
esphome/const.py CHANGED
@@ -4,7 +4,7 @@ from enum import Enum
4
4
 
5
5
  from esphome.enum import StrEnum
6
6
 
7
- __version__ = "2025.7.1"
7
+ __version__ = "2025.7.2"
8
8
 
9
9
  ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
10
10
  VALID_SUBSTITUTIONS_CHARACTERS = (
@@ -158,14 +158,14 @@ template<typename... Ts> class DelayAction : public Action<Ts...>, public Compon
158
158
  void play_complex(Ts... x) override {
159
159
  auto f = std::bind(&DelayAction<Ts...>::play_next_, this, x...);
160
160
  this->num_running_++;
161
- this->set_timeout(this->delay_.value(x...), f);
161
+ this->set_timeout("delay", this->delay_.value(x...), f);
162
162
  }
163
163
  float get_setup_priority() const override { return setup_priority::HARDWARE; }
164
164
 
165
165
  void play(Ts... x) override { /* ignore - see play_complex */
166
166
  }
167
167
 
168
- void stop() override { this->cancel_timeout(""); }
168
+ void stop() override { this->cancel_timeout("delay"); }
169
169
  };
170
170
 
171
171
  template<typename... Ts> class LambdaAction : public Action<Ts...> {
@@ -252,10 +252,10 @@ void Component::defer(const char *name, std::function<void()> &&f) { // NOLINT
252
252
  App.scheduler.set_timeout(this, name, 0, std::move(f));
253
253
  }
254
254
  void Component::set_timeout(uint32_t timeout, std::function<void()> &&f) { // NOLINT
255
- App.scheduler.set_timeout(this, "", timeout, std::move(f));
255
+ App.scheduler.set_timeout(this, static_cast<const char *>(nullptr), timeout, std::move(f));
256
256
  }
257
257
  void Component::set_interval(uint32_t interval, std::function<void()> &&f) { // NOLINT
258
- App.scheduler.set_interval(this, "", interval, std::move(f));
258
+ App.scheduler.set_interval(this, static_cast<const char *>(nullptr), interval, std::move(f));
259
259
  }
260
260
  void Component::set_retry(uint32_t initial_wait_time, uint8_t max_attempts, std::function<RetryResult(uint8_t)> &&f,
261
261
  float backoff_increase_factor) { // NOLINT
esphome/core/event_pool.h CHANGED
@@ -1,6 +1,6 @@
1
1
  #pragma once
2
2
 
3
- #if defined(USE_ESP32) || defined(USE_LIBRETINY)
3
+ #if defined(USE_ESP32)
4
4
 
5
5
  #include <atomic>
6
6
  #include <cstddef>
@@ -78,4 +78,4 @@ template<class T, uint8_t SIZE> class EventPool {
78
78
 
79
79
  } // namespace esphome
80
80
 
81
- #endif // defined(USE_ESP32) || defined(USE_LIBRETINY)
81
+ #endif // defined(USE_ESP32)
@@ -1,17 +1,12 @@
1
1
  #pragma once
2
2
 
3
- #if defined(USE_ESP32) || defined(USE_LIBRETINY)
3
+ #if defined(USE_ESP32)
4
4
 
5
5
  #include <atomic>
6
6
  #include <cstddef>
7
7
 
8
- #if defined(USE_ESP32)
9
8
  #include <freertos/FreeRTOS.h>
10
9
  #include <freertos/task.h>
11
- #elif defined(USE_LIBRETINY)
12
- #include <FreeRTOS.h>
13
- #include <task.h>
14
- #endif
15
10
 
16
11
  /*
17
12
  * Lock-free queue for single-producer single-consumer scenarios.
@@ -148,4 +143,4 @@ template<class T, uint8_t SIZE> class NotifyingLockFreeQueue : public LockFreeQu
148
143
 
149
144
  } // namespace esphome
150
145
 
151
- #endif // defined(USE_ESP32) || defined(USE_LIBRETINY)
146
+ #endif // defined(USE_ESP32)
@@ -446,7 +446,7 @@ bool HOT Scheduler::cancel_item_(Component *component, bool is_static_string, co
446
446
  // Helper to cancel items by name - must be called with lock held
447
447
  bool HOT Scheduler::cancel_item_locked_(Component *component, const char *name_cstr, SchedulerItem::Type type) {
448
448
  // Early return if name is invalid - no items to cancel
449
- if (name_cstr == nullptr || name_cstr[0] == '\0') {
449
+ if (name_cstr == nullptr) {
450
450
  return false;
451
451
  }
452
452
 
esphome/core/scheduler.h CHANGED
@@ -114,16 +114,17 @@ class Scheduler {
114
114
  name_is_dynamic = false;
115
115
  }
116
116
 
117
- if (!name || !name[0]) {
117
+ if (!name) {
118
+ // nullptr case - no name provided
118
119
  name_.static_name = nullptr;
119
120
  } else if (make_copy) {
120
- // Make a copy for dynamic strings
121
+ // Make a copy for dynamic strings (including empty strings)
121
122
  size_t len = strlen(name);
122
123
  name_.dynamic_name = new char[len + 1];
123
124
  memcpy(name_.dynamic_name, name, len + 1);
124
125
  name_is_dynamic = true;
125
126
  } else {
126
- // Use static string directly
127
+ // Use static string directly (including empty strings)
127
128
  name_.static_name = name;
128
129
  }
129
130
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: esphome
3
- Version: 2025.7.1
3
+ Version: 2025.7.2
4
4
  Summary: ESPHome is a system to configure your microcontrollers by simple yet powerful configuration files and control them remotely through Home Automation systems.
5
5
  Author-email: The ESPHome Authors <esphome@openhomefoundation.org>
6
6
  License: MIT
@@ -5,7 +5,7 @@ esphome/codegen.py,sha256=H_WB4rj0uEowvlhEb31EjJQwutLQ5CQkJIsNgDK-wx8,1917
5
5
  esphome/config.py,sha256=b-Gh-DEx_pax0ZKqHTKb5gmMIvaQA71bJvE-15AI0JI,42211
6
6
  esphome/config_helpers.py,sha256=BpyuWRxj5edJGIW7VP4S59i4I8g8baSlWpNyu6nB_uM,5413
7
7
  esphome/config_validation.py,sha256=_SMAcS_AhMh0kaLki86hjPZp5b95culJZtQePqoL_fU,63712
8
- esphome/const.py,sha256=PAbR9XARIiUdZrf7bWN_u3L0cvd0QrG18u1mOyiG8Wc,43367
8
+ esphome/const.py,sha256=KwAeVg3hE8JEHR5Yp_X1tHFZCxXbepoWToDGgrgEhJE,43367
9
9
  esphome/coroutine.py,sha256=HNBqqhaTbpvsOI19bTXltxJCMVtoeqZPe4qTf4CKkAc,9309
10
10
  esphome/cpp_generator.py,sha256=khmyuRIOc-ST9zIZjX7uOWLy9sSJhk4C2KexoBv51uk,31946
11
11
  esphome/cpp_helpers.py,sha256=P9FVGpid75_UcKxIf-sj7GbhWGQNRcBm_2XVF3r7NtU,3998
@@ -197,7 +197,7 @@ esphome/components/api/api_server.cpp,sha256=UeLT60naPcxqmvJlMR6MClnPl1gT1cggyeO
197
197
  esphome/components/api/api_server.h,sha256=fRTT9rZEIFzD3iI89Z9P7Dniw7lnuOCPk_exYqCsOoI,6513
198
198
  esphome/components/api/client.py,sha256=47VYbSUN7SO3vjRHA4tzLw3Zwr8yhkbfLg9K7ELRDf8,2188
199
199
  esphome/components/api/custom_api_device.h,sha256=HIOBfs2zP5lRIC9ur-Ae9zHkCa5ekV023uIa0oklpdo,7599
200
- esphome/components/api/homeassistant_service.h,sha256=rdKnQmwfSEkkbLdBojqQTj0W1OGLblw5MCeP_kA5fm0,3396
200
+ esphome/components/api/homeassistant_service.h,sha256=DjziMNx7yMF_IbKqczm2j9tjIedLMTotPfnjdzF4ILM,3546
201
201
  esphome/components/api/list_entities.cpp,sha256=EMysqDt2yeMDwaiorf0taqF8pXCA0QAcnvviedNbFzI,3112
202
202
  esphome/components/api/list_entities.h,sha256=91kBP47ISJS7MQ9tg2kOmaYtLx-pPyquROzzBGkE66s,2898
203
203
  esphome/components/api/proto.cpp,sha256=vrXe3Hd1XWjzWi6osqMICAEEKNNx6A4GAo_KHQ7hRZA,2696
@@ -884,7 +884,7 @@ esphome/components/esp32_ble_tracker/__init__.py,sha256=ccak0vxtH0cvun10HRGFJJHo
884
884
  esphome/components/esp32_ble_tracker/automation.h,sha256=0pDA6EX__f14sT0KJwcnqg7UOsueKjjegHPznQj9biw,3795
885
885
  esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp,sha256=HYiT04Lc7UUf6R8bU4dzXjukHIYXxpUENDF3pbWsyEw,33210
886
886
  esphome/components/esp32_ble_tracker/esp32_ble_tracker.h,sha256=XBjgf-yrkXGxoaQqTeAw70A59y8Th2c-57ctmhiuH18,11028
887
- esphome/components/esp32_camera/__init__.py,sha256=ZGtx71UgtqHIhdZJSKHQqv7zIgtpFu6MFHfzAkf6DWc,13457
887
+ esphome/components/esp32_camera/__init__.py,sha256=oTS6Kr0_1ErZCAUKTm-S5yUCbxOZo4UhtSDef0gNX00,14036
888
888
  esphome/components/esp32_camera/esp32_camera.cpp,sha256=LLGw2p5RsbO-lCFBqkZsuzitMex1N3y3bEoZhnMV7k4,17110
889
889
  esphome/components/esp32_camera/esp32_camera.h,sha256=ojiwjGpzUhYQepifWD2PyjByQklFRtQRTJrXFbZfSNM,7903
890
890
  esphome/components/esp32_camera_web_server/__init__.py,sha256=ViM-dcI4ld95yL1a3LuOO4H-eW_1GmcN7fHDlsyu3f8,938
@@ -1044,7 +1044,7 @@ esphome/components/gp8403/output/__init__.py,sha256=3VX9AD0N0SRXdOfKJcMMgjCwA1-R
1044
1044
  esphome/components/gp8403/output/gp8403_output.cpp,sha256=FQPUa_ZMgLz7LNHy6N8sNUpnI2hwOIZTRrwWtjXrbGs,714
1045
1045
  esphome/components/gp8403/output/gp8403_output.h,sha256=wJd_-CtUSxw5ujhR21E1zCiB9hvpl3Ktt665D3iQLf4,598
1046
1046
  esphome/components/gpio/__init__.py,sha256=afIFpPG_fsom-8vYV1yRyvhSCFyASlAdraUCuztWQZ4,103
1047
- esphome/components/gpio/binary_sensor/__init__.py,sha256=_rb3IP-gt1Fq5wSoFG36L7YATLF4xX2dRNlDI9sM1kU,2295
1047
+ esphome/components/gpio/binary_sensor/__init__.py,sha256=Q0P2-6zpxSYg3MFW1vx5SeZju27C-kOc4G5nEtE8ugg,2893
1048
1048
  esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp,sha256=wVa5pNQMnUOO9RUovnf6G8MYQtKQoRSojA3MItHLnbg,3131
1049
1049
  esphome/components/gpio/binary_sensor/gpio_binary_sensor.h,sha256=ukwmyxJhiYXMczcT16zwdliTX5Brf8fdgDzid6l13wE,2000
1050
1050
  esphome/components/gpio/one_wire/__init__.py,sha256=oH6-6zy18pG_7iqzLegjh4AbjnbZHqBRZKHdHBI-828,714
@@ -1550,7 +1550,7 @@ esphome/components/lock/__init__.py,sha256=z2ykcnNNmzRbri8sqwqQmbX0WtEkBV_Tazr1R
1550
1550
  esphome/components/lock/automation.h,sha256=7MU5AuJizydt7mKTr_uFsNleFI2jeBf7B_dNp3e8Fks,1771
1551
1551
  esphome/components/lock/lock.cpp,sha256=IyEt5xShAxMpmcn_GAPFv2lRCS-kr4MjjfExxfXuK-Q,3212
1552
1552
  esphome/components/lock/lock.h,sha256=p_t5cG-75MNGVM8zEyfKJlziSjeUiIbpYan3tlZG6W8,6042
1553
- esphome/components/logger/__init__.py,sha256=cbMgKmeOZDS_s2aIFshjAQQnluSiylYe9BfEv-fFymc,16201
1553
+ esphome/components/logger/__init__.py,sha256=6nw19OHeHlqIoSGqqxgeg5FzWkbyFILQh_Il1PqUQTs,16203
1554
1554
  esphome/components/logger/logger.cpp,sha256=aIra5ZZ5OEAPuqDgxZd3zkyAf46Jchht6mx-mcv380U,11704
1555
1555
  esphome/components/logger/logger.h,sha256=Tkdz9qoSTiyx6Ebp9jBUnGMXyxG1iH6LTJoJfguTOaA,14460
1556
1556
  esphome/components/logger/logger_esp32.cpp,sha256=NJddudDpsMP1fdV0mel8zXd7VNgMxqRIfarLp3uJPe0,6220
@@ -1600,7 +1600,7 @@ esphome/components/lvgl/schemas.py,sha256=fxD_8okg0EtPKHjdDl2x2buvjg0syEZPVudTk2
1600
1600
  esphome/components/lvgl/styles.py,sha256=692QwPARqDICFFSkgmBVS-M1mDyOxNg2AftYgU4ZrMY,3144
1601
1601
  esphome/components/lvgl/touchscreens.py,sha256=CntwVa1EUu6iBnxfvuv0rCYd_Njmf451CYdRqQyb9N4,1607
1602
1602
  esphome/components/lvgl/trigger.py,sha256=brfRjSE7-LXKBttQP7pG6W5A2KPzmFiNzQzeQiyW250,3463
1603
- esphome/components/lvgl/types.py,sha256=corOqfPfZtK1WtIUvJ8TOFLhjcn5vjTi5dJvwX-gCZI,6130
1603
+ esphome/components/lvgl/types.py,sha256=M-DJvNheEj7AVZgzfdFfcReXO5rk0TIKWntAQl97LZw,6134
1604
1604
  esphome/components/lvgl/binary_sensor/__init__.py,sha256=UaG5F3trL-S9P807PCbM2hHT4EUxAS0obSd6tlHXEoQ,1174
1605
1605
  esphome/components/lvgl/light/__init__.py,sha256=fyfI3RNQ67fA8yKhIirLg9ZLV4wFNMNvalqwqs04rqM,1006
1606
1606
  esphome/components/lvgl/light/lvgl_light.h,sha256=bNvnIYH7UrvVHgWxIIlP2XAfsmEVDzz2-aIA6DbR1iU,1231
@@ -1628,7 +1628,7 @@ esphome/components/lvgl/widgets/label.py,sha256=5xl1a6apdJgGKmkpL8m7RDASjaeKzjKT
1628
1628
  esphome/components/lvgl/widgets/led.py,sha256=qoe_kvZpoRkwbxz25Z66KQ__KLC2tfhAukChp1jdlDc,888
1629
1629
  esphome/components/lvgl/widgets/line.py,sha256=XwTZxoLeWb5_Bx4cRBjBxLd83DLGqFXSE8t9jNYasXk,1355
1630
1630
  esphome/components/lvgl/widgets/lv_bar.py,sha256=FbDNEL9huqeKGiE_nqyoB6BVPOCEsQd3YgO5m07SI3M,2274
1631
- esphome/components/lvgl/widgets/meter.py,sha256=yPC9kFVGjOdJqjBlCVKxDrVEjyfLUXlEUjuy3UhcCh0,11526
1631
+ esphome/components/lvgl/widgets/meter.py,sha256=PKanq-3YDwuFto25OVpgYQm61bWXMLMUo-7UPifGFOY,11680
1632
1632
  esphome/components/lvgl/widgets/msgbox.py,sha256=i98hz6RKJRMWQ4wz9T1qOHzmdmZ6yHDvHDeJ1T9_Gt0,5335
1633
1633
  esphome/components/lvgl/widgets/obj.py,sha256=6lKIfsdKLWIE8u_Lw0X0ChMCKcV8EZYF8WQKQEBCKYU,439
1634
1634
  esphome/components/lvgl/widgets/page.py,sha256=W7kQ1xfJLRMdy6wFKoA6tZxUXNKGBZWrjMw9OZRfLqA,5870
@@ -2816,8 +2816,8 @@ esphome/components/speaker/__init__.py,sha256=2juDem8QadLMwzFp8Rvl-KeIbE-iIEsCtD
2816
2816
  esphome/components/speaker/automation.h,sha256=tVSTV49GvHk0bCEgLz3rNYFe8B1F0kXLgE-WihuRaV8,2320
2817
2817
  esphome/components/speaker/speaker.h,sha256=Y6EuDzsIx8GDcFeWnYXg4cXiBU-6CkmrRCaMpXQYiWo,4355
2818
2818
  esphome/components/speaker/media_player/__init__.py,sha256=QfJfrfwYuTEWJ_P3mVACjiATFPHSfDK-eJ0YOiSgatE,15441
2819
- esphome/components/speaker/media_player/audio_pipeline.cpp,sha256=VjodnH-hIPRtulk4iPt_oaym3qr_O2-fK3dyufenPnQ,22147
2820
- esphome/components/speaker/media_player/audio_pipeline.h,sha256=MYt7_kp4IJDSTnXWqLaXIkbbNkGx6F_imSryFo2UUkc,5000
2819
+ esphome/components/speaker/media_player/audio_pipeline.cpp,sha256=YspF1nK940wWOodZVtOMW7_E-rt2DzyCfz7iQuY9rhs,22411
2820
+ esphome/components/speaker/media_player/audio_pipeline.h,sha256=QAQGzGUnBjx7_WaZYGIuLKtrKrs7-f3YV329h2wahQM,5029
2821
2821
  esphome/components/speaker/media_player/automation.h,sha256=I8psUHnJ8T3fkM05h1yEYDxb0yWe6Vjz7i30OSVA3Is,683
2822
2822
  esphome/components/speaker/media_player/speaker_media_player.cpp,sha256=M_eFKuivv__swCA8xhWd4-cfNdrY2h8Vm8VfG8DUDZ8,22610
2823
2823
  esphome/components/speaker/media_player/speaker_media_player.h,sha256=qg7oX4bKiWWmVfiT5ZD4DdafLBGXmvXFuU5932m1nIo,5399
@@ -3371,8 +3371,8 @@ esphome/components/vl53l0x/sensor.py,sha256=qQVBjhMl_nGbzuAHY0Fz2GnG5TkNJLuyFRYm
3371
3371
  esphome/components/vl53l0x/vl53l0x_sensor.cpp,sha256=mBGggbztlCSvjPDA6IY3p1uBnziXdkaMKLCLWcZL0ok,15170
3372
3372
  esphome/components/vl53l0x/vl53l0x_sensor.h,sha256=_GZqT0tHSoYbqrHiC0_PAttk3cuHH9sy1lirQaIYfQU,2593
3373
3373
  esphome/components/voice_assistant/__init__.py,sha256=cYEmZoI6w05kMF_ZrFHgsvKOLGO1GIT-a3aUWqepNt4,15264
3374
- esphome/components/voice_assistant/voice_assistant.cpp,sha256=kPdneGHH-p3XzfgoQvk_8pYIcY_quszg7Ck6X-7_fYM,32996
3375
- esphome/components/voice_assistant/voice_assistant.h,sha256=M42wYACkOB90iIeejCXaFnqRZkETsEjjJSi7j_YZxg8,12381
3374
+ esphome/components/voice_assistant/voice_assistant.cpp,sha256=wxUOQJ91fgcRw0GuvTCHKp_DO07f6A3KJyN7zwVcGnA,33860
3375
+ esphome/components/voice_assistant/voice_assistant.h,sha256=dNPJHpjnu-kDlHD861cDmwxw0yYbCBOU4VM2J2opSN0,12475
3376
3376
  esphome/components/voltage_sampler/__init__.py,sha256=IU5YrROZSNyuAP1d6M_V3ZGAwNjXCHPcVy5nMjZ953Y,155
3377
3377
  esphome/components/voltage_sampler/voltage_sampler.h,sha256=Y67FLOpOzW29v29BRRyYgEmGZ_B8QnUUaqJMH6FA3jM,337
3378
3378
  esphome/components/wake_on_lan/__init__.py,sha256=-RYpXD02o3dlFnKzOCYk58bUbxfD2v-wj1ECywj-cgI,50
@@ -3392,7 +3392,7 @@ esphome/components/web_server/list_entities.cpp,sha256=yQ3skDSDFnnKsEpLdkyjzySmX
3392
3392
  esphome/components/web_server/list_entities.h,sha256=afeebykHFeV1rLpywOSZqaPqfL-K-MkLByfJWrkrb-M,2561
3393
3393
  esphome/components/web_server/server_index_v2.h,sha256=cVFZzhvmwcUzN815XwYnx2L9zf5lH-MAZjolRearXdw,74968
3394
3394
  esphome/components/web_server/server_index_v3.h,sha256=5SZfSHDG4xAyXNBxUqs8-jSVwocgfRbNbTSMwzVl1io,476640
3395
- esphome/components/web_server/web_server.cpp,sha256=Yo8PAJS0U4tmE9iQ5a4hZG8g3j4Ip6CF6qeyJ81WTrE,73600
3395
+ esphome/components/web_server/web_server.cpp,sha256=bwc2jb7b4-7mtrztGpW9SMWseuh38vHihViuUp5qsho,73613
3396
3396
  esphome/components/web_server/web_server.h,sha256=AGCOdOaZe7Xe5nCL4rHhqWNg-uo5cc6nu84vQr4GdrQ,21558
3397
3397
  esphome/components/web_server/web_server_v1.cpp,sha256=ZnFV1J2YAzAT2mtR-eeVgG1TSVpy953EF1yVKYdTcTg,7409
3398
3398
  esphome/components/web_server/ota/__init__.py,sha256=w4Ufe8mN-5r0913AODCjl9LlCKMpWRTFMSCEmLgRzxE,1018
@@ -3450,7 +3450,7 @@ esphome/components/wireguard/__init__.py,sha256=EFer9fT28hNCmf4x36e1m5icdIMueynA
3450
3450
  esphome/components/wireguard/binary_sensor.py,sha256=ufCoEUae0jzZoSjao1_L9zGe_fS6irjTaw5OEKJHQuE,1076
3451
3451
  esphome/components/wireguard/sensor.py,sha256=JUHo1XEl81N5hn2BYemaToa4t7aLKqjx_J36cLUj71I,823
3452
3452
  esphome/components/wireguard/text_sensor.py,sha256=WuCrOiKHRgljObCWDVZ2hfk7PYQUaiQ1X7E9lnoUODs,711
3453
- esphome/components/wireguard/wireguard.cpp,sha256=FD1KVju0qGBXqT4wkkA9ZU7llygmV1wUGN7qw0qQEtI,10328
3453
+ esphome/components/wireguard/wireguard.cpp,sha256=8XahOW_eGPgY4fL1vDwcpEkfel7NB5TiZ7-AyAbrwYc,10455
3454
3454
  esphome/components/wireguard/wireguard.h,sha256=BaaRAyqK0gP59f96D8w4gVBW43a4bMvAdYzmPTK4olc,4969
3455
3455
  esphome/components/wk2132_i2c/__init__.py,sha256=Vd-c0QRYTqxADFhwuTPjA_wnyqD5cZcHReN9vGTA1Nc,848
3456
3456
  esphome/components/wk2132_i2c/wk2132_i2c.cpp,sha256=u2T0Rtrasgnxxslaau20-fPA0Zo6NxysL54x3Mdqc9s,146
@@ -3597,10 +3597,10 @@ esphome/core/application.cpp,sha256=Tsl2sCS3awRjrJL5A9g2syW7s8tRwl1RtoCUhZUrQsI,
3597
3597
  esphome/core/application.h,sha256=upjEdRfEZWrH27s3PFYqmORG7Kd4SlbtexipPdYKwUk,21848
3598
3598
  esphome/core/area.h,sha256=mtFxmuv8fC2hArcey3cZ0F6hMXSO2QpFZ9Xv49z4rvk,393
3599
3599
  esphome/core/automation.h,sha256=UgoI-ebaL5YJ_cyRB-3ijHQxzt4cTbTaWw4eRGoOwBI,8627
3600
- esphome/core/base_automation.h,sha256=wAJu_yy1tDjwARdCZ312t7anzR9dBF_54qiXm1sy-_g,11216
3600
+ esphome/core/base_automation.h,sha256=C-6op63m-ghuaUy-q515XAx7iKjoxBFbQeRLmRtQGSM,11230
3601
3601
  esphome/core/color.cpp,sha256=gcFk-FTJzvrePzqgA5gvsXv8iWct0ykdVGx_ivrilR0,254
3602
3602
  esphome/core/color.h,sha256=K2iTTKgOgXcCm61S1f2P_k7YheKP654gUubWq5X0FhE,6647
3603
- esphome/core/component.cpp,sha256=rHgS2cukrb3ukBp74KtMEKc2n7U3D7oNLgPdpZrZvmA,16811
3603
+ esphome/core/component.cpp,sha256=ctFoir-YMeK3WQ_Tjg9QxizA0cjSYX1UaIp9mdE01Zc,16875
3604
3604
  esphome/core/component.h,sha256=Z1TYaQDGkoddm75zaPTQc_C0STpCCl200oDZsoc6yAk,17985
3605
3605
  esphome/core/component_iterator.cpp,sha256=VD_bSv474jQlKctKIzYSPUK8zpm01PJ1Fymix1c92Jg,11121
3606
3606
  esphome/core/component_iterator.h,sha256=-j9hGIY8mCmgq2nLuoG_IFY0lSoHkImXMEVtUKYpngA,3791
@@ -3614,12 +3614,12 @@ esphome/core/doxygen.h,sha256=9fAJ2T-1z96-NYnj63vQhsnKthHBrh3EqBnY0h3ZN-A,439
3614
3614
  esphome/core/entity_base.cpp,sha256=4JMAGN8w3bMW-kTchQxlbA-zS43NOdYhT1Fo0Celx78,2453
3615
3615
  esphome/core/entity_base.h,sha256=bzNEdGDbJsO0ijowJHmLMLeCN3mY1hqzWK4dF39bpik,6429
3616
3616
  esphome/core/entity_helpers.py,sha256=03-t7OcXa8L-_634OAEU9s-opgjoIKqC9acXHoXR6lA,8169
3617
- esphome/core/event_pool.h,sha256=TjA2sl_s5ScKC9d_5nssvImbPkpJJUWo5DDZwCaZ0QU,2457
3617
+ esphome/core/event_pool.h,sha256=X8_-72rODgpG9P_dSjezkJjFaaFvXy0cV42o6X-Vv1Q,2405
3618
3618
  esphome/core/gpio.h,sha256=kLkCnPxu4_1CsLR4BI_Baj1lDGoRIh8uubbwsIkJPIA,2575
3619
3619
  esphome/core/hal.h,sha256=Le0-vtdDylYCaE9i4yvrv5-Y5PB5xoL3PM2FfMJsIeA,970
3620
3620
  esphome/core/helpers.cpp,sha256=eyOYJWmMEcdX8dJ3RoIcl6MeOmc0C3cTPafZDTzQ4OM,20961
3621
3621
  esphome/core/helpers.h,sha256=213N4rXgWCcuBB-aZDV9TW5UIYRzzGhU44YXWJz2Ys4,33961
3622
- esphome/core/lock_free_queue.h,sha256=S6QMMT8L8rG_qOzkTHWqcP9amok99hFhXGlZoj8C4XU,5104
3622
+ esphome/core/lock_free_queue.h,sha256=j3wSEyxqkjBDnCwEQd4ARHDubjSrLPxMAzZvqdNN2co,4953
3623
3623
  esphome/core/log.cpp,sha256=cc6JIMRlIEk7lCQa6JFrL6bTBZ89xWNLwf26AFNzKC0,1625
3624
3624
  esphome/core/log.h,sha256=Fb0_ORK0q-WV0i49gzb8i9_C38RUe8VILIdbu1Bel5M,6627
3625
3625
  esphome/core/log_const_en.h,sha256=zrLwl0tQmh1pkNB1bq8lqLdJKbo7_dFmppRI7hVKAf8,133
@@ -3628,8 +3628,8 @@ esphome/core/optional.h,sha256=uKMzglliXSA5eC3ujwrADmyt8m7X4WkBQcOL6p3ET7E,7144
3628
3628
  esphome/core/preferences.h,sha256=RxgWuAi-uo6SZiK8UKX4KTwVfIMnaaLvrZP2rqTn_mE,1959
3629
3629
  esphome/core/ring_buffer.cpp,sha256=6vOoKNjO4dSLYfqJYM8AXclpKgQOH6C79CqocwTSv-k,3526
3630
3630
  esphome/core/ring_buffer.h,sha256=4SeN2DYZLCHrLIjSPDsiAynIjwOoItiRUDO-u1wjq-o,2997
3631
- esphome/core/scheduler.cpp,sha256=EujNgcC6CgG_IGydPyylRB3qC4Q34cgcn7eIfqD1Zx0,19968
3632
- esphome/core/scheduler.h,sha256=Im_s45ic3Km2ejByqVfeTSMYWJDu6oAf3zVvn1EM_iw,8193
3631
+ esphome/core/scheduler.cpp,sha256=RsVXsvfljDcLytZ4sLQam4lLL2tNHSPrhg3LGS9YMcA,19944
3632
+ esphome/core/scheduler.h,sha256=BhP31NgW5qzoUdAs-jITMw-pv3OIGJk_ZVyFvqqANuU,8276
3633
3633
  esphome/core/string_ref.cpp,sha256=of1TYMY6t3t4HjjPLSiItuPSa62AMG0lK_CU2HS1RvM,242
3634
3634
  esphome/core/string_ref.h,sha256=Rd8HVBiUZrPA3TkPCwuAxGw91VX-e3Fky812OCNhNvA,5227
3635
3635
  esphome/core/time.cpp,sha256=ML3sAvlSgDaUkhbPmBkUkSFhGM78j0d7cL8CHAIgfow,7667
@@ -3655,9 +3655,9 @@ esphome/dashboard/util/itertools.py,sha256=8eLrWEWmICLtXNxkKdYPQV0c_N4GEz8m9Npnb
3655
3655
  esphome/dashboard/util/password.py,sha256=cQz3b9B-ijTe7zS6BeCW0hc3pWv6JjC78jmnycYYAh8,321
3656
3656
  esphome/dashboard/util/subprocess.py,sha256=T8EW6dbU4LPd2DG1dRrdh8li71tt6J1isn411poMhkk,1022
3657
3657
  esphome/dashboard/util/text.py,sha256=wwFtORlvHjsYkqb68IT-772LHAhWxT4OtnkIcPICQB0,317
3658
- esphome-2025.7.1.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3659
- esphome-2025.7.1.dist-info/METADATA,sha256=ymoQtqRfsjvehTL_sQHDsy8F-KE85KMKqvkBi5CloGQ,3705
3660
- esphome-2025.7.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
3661
- esphome-2025.7.1.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3662
- esphome-2025.7.1.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3663
- esphome-2025.7.1.dist-info/RECORD,,
3658
+ esphome-2025.7.2.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3659
+ esphome-2025.7.2.dist-info/METADATA,sha256=DPtrT8cCskiqvQyqD7C-Mb3Ahj9UEjYZciLgbs5ciuo,3705
3660
+ esphome-2025.7.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
3661
+ esphome-2025.7.2.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3662
+ esphome-2025.7.2.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3663
+ esphome-2025.7.2.dist-info/RECORD,,