esphome 2025.5.0b6__py3-none-any.whl → 2025.5.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.
Files changed (28) hide show
  1. esphome/components/api/api_connection.cpp +6 -2
  2. esphome/components/debug/debug_component.cpp +0 -4
  3. esphome/components/esp32/core.cpp +8 -1
  4. esphome/components/esp8266/gpio.cpp +10 -1
  5. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +53 -63
  6. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -0
  7. esphome/components/logger/__init__.py +2 -0
  8. esphome/components/logger/logger.h +4 -4
  9. esphome/components/logger/select/__init__.py +5 -4
  10. esphome/components/lvgl/schemas.py +34 -20
  11. esphome/components/micro_wake_word/streaming_model.cpp +5 -1
  12. esphome/components/online_image/__init__.py +1 -1
  13. esphome/components/online_image/png_image.cpp +21 -1
  14. esphome/components/online_image/png_image.h +5 -3
  15. esphome/components/rp2040/gpio.cpp +26 -9
  16. esphome/components/speaker/media_player/audio_pipeline.cpp +10 -10
  17. esphome/components/tuya/select/__init__.py +2 -2
  18. esphome/const.py +1 -1
  19. esphome/core/hal.h +5 -0
  20. esphome/core/helpers.h +1 -0
  21. esphome/core/string_ref.h +1 -0
  22. esphome/dashboard/web_server.py +12 -7
  23. {esphome-2025.5.0b6.dist-info → esphome-2025.5.2.dist-info}/METADATA +1 -1
  24. {esphome-2025.5.0b6.dist-info → esphome-2025.5.2.dist-info}/RECORD +28 -28
  25. {esphome-2025.5.0b6.dist-info → esphome-2025.5.2.dist-info}/WHEEL +0 -0
  26. {esphome-2025.5.0b6.dist-info → esphome-2025.5.2.dist-info}/entry_points.txt +0 -0
  27. {esphome-2025.5.0b6.dist-info → esphome-2025.5.2.dist-info}/licenses/LICENSE +0 -0
  28. {esphome-2025.5.0b6.dist-info → esphome-2025.5.2.dist-info}/top_level.txt +0 -0
@@ -4,11 +4,11 @@
4
4
  #include <cinttypes>
5
5
  #include <utility>
6
6
  #include "esphome/components/network/util.h"
7
+ #include "esphome/core/application.h"
7
8
  #include "esphome/core/entity_base.h"
8
9
  #include "esphome/core/hal.h"
9
10
  #include "esphome/core/log.h"
10
11
  #include "esphome/core/version.h"
11
- #include "esphome/core/application.h"
12
12
 
13
13
  #ifdef USE_DEEP_SLEEP
14
14
  #include "esphome/components/deep_sleep/deep_sleep_component.h"
@@ -153,7 +153,11 @@ void APIConnection::loop() {
153
153
  } else {
154
154
  this->last_traffic_ = App.get_loop_component_start_time();
155
155
  // read a packet
156
- this->read_message(buffer.data_len, buffer.type, &buffer.container[buffer.data_offset]);
156
+ if (buffer.data_len > 0) {
157
+ this->read_message(buffer.data_len, buffer.type, &buffer.container[buffer.data_offset]);
158
+ } else {
159
+ this->read_message(0, buffer.type, nullptr);
160
+ }
157
161
  if (this->remove_)
158
162
  return;
159
163
  }
@@ -15,10 +15,6 @@ namespace debug {
15
15
  static const char *const TAG = "debug";
16
16
 
17
17
  void DebugComponent::dump_config() {
18
- #ifndef ESPHOME_LOG_HAS_DEBUG
19
- return; // Can't log below if debug logging is disabled
20
- #endif
21
-
22
18
  ESP_LOGCONFIG(TAG, "Debug component:");
23
19
  #ifdef USE_TEXT_SENSOR
24
20
  LOG_TEXT_SENSOR(" ", "Device info", this->device_info_);
@@ -15,8 +15,9 @@
15
15
  #ifdef USE_ARDUINO
16
16
  #include <Esp.h>
17
17
  #else
18
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0)
18
19
  #include <esp_clk_tree.h>
19
-
20
+ #endif
20
21
  void setup();
21
22
  void loop();
22
23
  #endif
@@ -63,7 +64,13 @@ uint32_t arch_get_cpu_cycle_count() { return cpu_hal_get_cycle_count(); }
63
64
  uint32_t arch_get_cpu_freq_hz() {
64
65
  uint32_t freq = 0;
65
66
  #ifdef USE_ESP_IDF
67
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0)
66
68
  esp_clk_tree_src_get_freq_hz(SOC_MOD_CLK_CPU, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &freq);
69
+ #else
70
+ rtc_cpu_freq_config_t config;
71
+ rtc_clk_cpu_freq_get_config(&config);
72
+ freq = config.freq_mhz * 1000000U;
73
+ #endif
67
74
  #elif defined(USE_ARDUINO)
68
75
  freq = ESP.getCpuFreqMHz() * 1000000;
69
76
  #endif
@@ -40,6 +40,7 @@ struct ISRPinArg {
40
40
  volatile uint32_t *mode_set_reg;
41
41
  volatile uint32_t *mode_clr_reg;
42
42
  volatile uint32_t *func_reg;
43
+ volatile uint32_t *control_reg;
43
44
  uint32_t mask;
44
45
  };
45
46
 
@@ -54,6 +55,7 @@ ISRInternalGPIOPin ESP8266GPIOPin::to_isr() const {
54
55
  arg->mode_set_reg = &GPES;
55
56
  arg->mode_clr_reg = &GPEC;
56
57
  arg->func_reg = &GPF(this->pin_);
58
+ arg->control_reg = &GPC(this->pin_);
57
59
  arg->mask = 1 << this->pin_;
58
60
  } else {
59
61
  arg->in_reg = &GP16I;
@@ -62,6 +64,7 @@ ISRInternalGPIOPin ESP8266GPIOPin::to_isr() const {
62
64
  arg->mode_set_reg = &GP16E;
63
65
  arg->mode_clr_reg = nullptr;
64
66
  arg->func_reg = &GPF16;
67
+ arg->control_reg = nullptr;
65
68
  arg->mask = 1;
66
69
  }
67
70
  return ISRInternalGPIOPin((void *) arg);
@@ -143,11 +146,17 @@ void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) {
143
146
  if (arg->pin < 16) {
144
147
  if (flags & gpio::FLAG_OUTPUT) {
145
148
  *arg->mode_set_reg = arg->mask;
146
- } else {
149
+ if (flags & gpio::FLAG_OPEN_DRAIN) {
150
+ *arg->control_reg |= 1 << GPCD;
151
+ } else {
152
+ *arg->control_reg &= ~(1 << GPCD);
153
+ }
154
+ } else if (flags & gpio::FLAG_INPUT) {
147
155
  *arg->mode_clr_reg = arg->mask;
148
156
  }
149
157
  if (flags & gpio::FLAG_PULLUP) {
150
158
  *arg->func_reg |= 1 << GPFPU;
159
+ *arg->control_reg |= 1 << GPCD;
151
160
  } else {
152
161
  *arg->func_reg &= ~(1 << GPFPU);
153
162
  }
@@ -30,11 +30,11 @@ static const int32_t DC_OFFSET_MOVING_AVERAGE_COEFFICIENT_DENOMINATOR = 1000;
30
30
  static const char *const TAG = "i2s_audio.microphone";
31
31
 
32
32
  enum MicrophoneEventGroupBits : uint32_t {
33
- COMMAND_STOP = (1 << 0), // stops the microphone task
34
- TASK_STARTING = (1 << 10),
35
- TASK_RUNNING = (1 << 11),
36
- TASK_STOPPING = (1 << 12),
37
- TASK_STOPPED = (1 << 13),
33
+ COMMAND_STOP = (1 << 0), // stops the microphone task, set and cleared by ``loop``
34
+
35
+ TASK_STARTING = (1 << 10), // set by mic task, cleared by ``loop``
36
+ TASK_RUNNING = (1 << 11), // set by mic task, cleared by ``loop``
37
+ TASK_STOPPED = (1 << 13), // set by mic task, cleared by ``loop``
38
38
 
39
39
  ALL_BITS = 0x00FFFFFF, // All valid FreeRTOS event group bits
40
40
  };
@@ -151,24 +151,21 @@ bool I2SAudioMicrophone::start_driver_() {
151
151
  config.mode = (i2s_mode_t) (config.mode | I2S_MODE_ADC_BUILT_IN);
152
152
  err = i2s_driver_install(this->parent_->get_port(), &config, 0, nullptr);
153
153
  if (err != ESP_OK) {
154
- ESP_LOGW(TAG, "Error installing I2S driver: %s", esp_err_to_name(err));
155
- this->status_set_error();
154
+ ESP_LOGE(TAG, "Error installing I2S driver: %s", esp_err_to_name(err));
156
155
  return false;
157
156
  }
158
157
 
159
158
  err = i2s_set_adc_mode(ADC_UNIT_1, this->adc_channel_);
160
159
  if (err != ESP_OK) {
161
- ESP_LOGW(TAG, "Error setting ADC mode: %s", esp_err_to_name(err));
162
- this->status_set_error();
160
+ ESP_LOGE(TAG, "Error setting ADC mode: %s", esp_err_to_name(err));
163
161
  return false;
164
162
  }
163
+
165
164
  err = i2s_adc_enable(this->parent_->get_port());
166
165
  if (err != ESP_OK) {
167
- ESP_LOGW(TAG, "Error enabling ADC: %s", esp_err_to_name(err));
168
- this->status_set_error();
166
+ ESP_LOGE(TAG, "Error enabling ADC: %s", esp_err_to_name(err));
169
167
  return false;
170
168
  }
171
-
172
169
  } else
173
170
  #endif
174
171
  {
@@ -177,8 +174,7 @@ bool I2SAudioMicrophone::start_driver_() {
177
174
 
178
175
  err = i2s_driver_install(this->parent_->get_port(), &config, 0, nullptr);
179
176
  if (err != ESP_OK) {
180
- ESP_LOGW(TAG, "Error installing I2S driver: %s", esp_err_to_name(err));
181
- this->status_set_error();
177
+ ESP_LOGE(TAG, "Error installing I2S driver: %s", esp_err_to_name(err));
182
178
  return false;
183
179
  }
184
180
 
@@ -187,8 +183,7 @@ bool I2SAudioMicrophone::start_driver_() {
187
183
 
188
184
  err = i2s_set_pin(this->parent_->get_port(), &pin_config);
189
185
  if (err != ESP_OK) {
190
- ESP_LOGW(TAG, "Error setting I2S pin: %s", esp_err_to_name(err));
191
- this->status_set_error();
186
+ ESP_LOGE(TAG, "Error setting I2S pin: %s", esp_err_to_name(err));
192
187
  return false;
193
188
  }
194
189
  }
@@ -203,8 +198,7 @@ bool I2SAudioMicrophone::start_driver_() {
203
198
  /* Allocate a new RX channel and get the handle of this channel */
204
199
  err = i2s_new_channel(&chan_cfg, NULL, &this->rx_handle_);
205
200
  if (err != ESP_OK) {
206
- ESP_LOGW(TAG, "Error creating new I2S channel: %s", esp_err_to_name(err));
207
- this->status_set_error();
201
+ ESP_LOGE(TAG, "Error creating new I2S channel: %s", esp_err_to_name(err));
208
202
  return false;
209
203
  }
210
204
 
@@ -276,22 +270,20 @@ bool I2SAudioMicrophone::start_driver_() {
276
270
  err = i2s_channel_init_std_mode(this->rx_handle_, &std_cfg);
277
271
  }
278
272
  if (err != ESP_OK) {
279
- ESP_LOGW(TAG, "Error initializing I2S channel: %s", esp_err_to_name(err));
280
- this->status_set_error();
273
+ ESP_LOGE(TAG, "Error initializing I2S channel: %s", esp_err_to_name(err));
281
274
  return false;
282
275
  }
283
276
 
284
277
  /* Before reading data, start the RX channel first */
285
278
  i2s_channel_enable(this->rx_handle_);
286
279
  if (err != ESP_OK) {
287
- ESP_LOGW(TAG, "Error enabling I2S Microphone: %s", esp_err_to_name(err));
288
- this->status_set_error();
280
+ ESP_LOGE(TAG, "Error enabling I2S Microphone: %s", esp_err_to_name(err));
289
281
  return false;
290
282
  }
291
283
  #endif
292
284
 
293
- this->status_clear_error();
294
285
  this->configure_stream_settings_(); // redetermine the settings in case some settings were changed after compilation
286
+
295
287
  return true;
296
288
  }
297
289
 
@@ -303,71 +295,55 @@ void I2SAudioMicrophone::stop() {
303
295
  }
304
296
 
305
297
  void I2SAudioMicrophone::stop_driver_() {
298
+ // There is no harm continuing to unload the driver if an error is ever returned by the various functions. This
299
+ // ensures that we stop/unload the driver when it only partially starts.
300
+
306
301
  esp_err_t err;
307
302
  #ifdef USE_I2S_LEGACY
308
303
  #if SOC_I2S_SUPPORTS_ADC
309
304
  if (this->adc_) {
310
305
  err = i2s_adc_disable(this->parent_->get_port());
311
306
  if (err != ESP_OK) {
312
- ESP_LOGW(TAG, "Error disabling ADC: %s", esp_err_to_name(err));
313
- this->status_set_error();
314
- return;
307
+ ESP_LOGW(TAG, "Error disabling ADC - it may not have started: %s", esp_err_to_name(err));
315
308
  }
316
309
  }
317
310
  #endif
318
311
  err = i2s_stop(this->parent_->get_port());
319
312
  if (err != ESP_OK) {
320
- ESP_LOGW(TAG, "Error stopping I2S microphone: %s", esp_err_to_name(err));
321
- this->status_set_error();
322
- return;
313
+ ESP_LOGW(TAG, "Error stopping I2S microphone - it may not have started: %s", esp_err_to_name(err));
323
314
  }
324
315
  err = i2s_driver_uninstall(this->parent_->get_port());
325
316
  if (err != ESP_OK) {
326
- ESP_LOGW(TAG, "Error uninstalling I2S driver: %s", esp_err_to_name(err));
327
- this->status_set_error();
328
- return;
317
+ ESP_LOGW(TAG, "Error uninstalling I2S driver - it may not have started: %s", esp_err_to_name(err));
329
318
  }
330
319
  #else
331
320
  /* Have to stop the channel before deleting it */
332
321
  err = i2s_channel_disable(this->rx_handle_);
333
322
  if (err != ESP_OK) {
334
- ESP_LOGW(TAG, "Error stopping I2S microphone: %s", esp_err_to_name(err));
335
- this->status_set_error();
336
- return;
323
+ ESP_LOGW(TAG, "Error stopping I2S microphone - it may not have started: %s", esp_err_to_name(err));
337
324
  }
338
325
  /* If the handle is not needed any more, delete it to release the channel resources */
339
326
  err = i2s_del_channel(this->rx_handle_);
340
327
  if (err != ESP_OK) {
341
- ESP_LOGW(TAG, "Error deleting I2S channel: %s", esp_err_to_name(err));
342
- this->status_set_error();
343
- return;
328
+ ESP_LOGW(TAG, "Error deleting I2S channel - it may not have started: %s", esp_err_to_name(err));
344
329
  }
345
330
  #endif
346
331
  this->parent_->unlock();
347
- this->status_clear_error();
348
332
  }
349
333
 
350
334
  void I2SAudioMicrophone::mic_task(void *params) {
351
335
  I2SAudioMicrophone *this_microphone = (I2SAudioMicrophone *) params;
352
-
353
336
  xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_STARTING);
354
337
 
355
- uint8_t start_counter = 0;
356
- bool started = this_microphone->start_driver_();
357
- while (!started && start_counter < 10) {
358
- // Attempt to load the driver again in 100 ms. Doesn't slow down main loop since its in a task.
359
- vTaskDelay(pdMS_TO_TICKS(100));
360
- ++start_counter;
361
- started = this_microphone->start_driver_();
362
- }
338
+ { // Ensures the samples vector is freed when the task stops
363
339
 
364
- if (started) {
365
- xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_RUNNING);
366
340
  const size_t bytes_to_read = this_microphone->audio_stream_info_.ms_to_bytes(READ_DURATION_MS);
367
341
  std::vector<uint8_t> samples;
368
342
  samples.reserve(bytes_to_read);
369
343
 
370
- while (!(xEventGroupGetBits(this_microphone->event_group_) & COMMAND_STOP)) {
344
+ xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_RUNNING);
345
+
346
+ while (!(xEventGroupGetBits(this_microphone->event_group_) & MicrophoneEventGroupBits::COMMAND_STOP)) {
371
347
  if (this_microphone->data_callbacks_.size() > 0) {
372
348
  samples.resize(bytes_to_read);
373
349
  size_t bytes_read = this_microphone->read_(samples.data(), bytes_to_read, 2 * pdMS_TO_TICKS(READ_DURATION_MS));
@@ -382,9 +358,6 @@ void I2SAudioMicrophone::mic_task(void *params) {
382
358
  }
383
359
  }
384
360
 
385
- xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_STOPPING);
386
- this_microphone->stop_driver_();
387
-
388
361
  xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_STOPPED);
389
362
  while (true) {
390
363
  // Continuously delay until the loop method deletes the task
@@ -425,7 +398,10 @@ size_t I2SAudioMicrophone::read_(uint8_t *buf, size_t len, TickType_t ticks_to_w
425
398
  #endif
426
399
  if ((err != ESP_OK) && ((err != ESP_ERR_TIMEOUT) || (ticks_to_wait != 0))) {
427
400
  // Ignore ESP_ERR_TIMEOUT if ticks_to_wait = 0, as it will read the data on the next call
428
- ESP_LOGW(TAG, "Error reading from I2S microphone: %s", esp_err_to_name(err));
401
+ if (!this->status_has_warning()) {
402
+ // Avoid spamming the logs with the error message if its repeated
403
+ ESP_LOGW(TAG, "Error reading from I2S microphone: %s", esp_err_to_name(err));
404
+ }
429
405
  this->status_set_warning();
430
406
  return 0;
431
407
  }
@@ -452,7 +428,7 @@ void I2SAudioMicrophone::loop() {
452
428
  uint32_t event_group_bits = xEventGroupGetBits(this->event_group_);
453
429
 
454
430
  if (event_group_bits & MicrophoneEventGroupBits::TASK_STARTING) {
455
- ESP_LOGD(TAG, "Task has started, attempting to setup I2S audio driver");
431
+ ESP_LOGD(TAG, "Task started, attempting to allocate buffer");
456
432
  xEventGroupClearBits(this->event_group_, MicrophoneEventGroupBits::TASK_STARTING);
457
433
  }
458
434
 
@@ -463,23 +439,25 @@ void I2SAudioMicrophone::loop() {
463
439
  this->state_ = microphone::STATE_RUNNING;
464
440
  }
465
441
 
466
- if (event_group_bits & MicrophoneEventGroupBits::TASK_STOPPING) {
467
- ESP_LOGD(TAG, "Task is stopping, attempting to unload the I2S audio driver");
468
- xEventGroupClearBits(this->event_group_, MicrophoneEventGroupBits::TASK_STOPPING);
469
- }
470
-
471
442
  if ((event_group_bits & MicrophoneEventGroupBits::TASK_STOPPED)) {
472
- ESP_LOGD(TAG, "Task is finished, freeing resources");
443
+ ESP_LOGD(TAG, "Task finished, freeing resources and uninstalling I2S driver");
444
+
473
445
  vTaskDelete(this->task_handle_);
474
446
  this->task_handle_ = nullptr;
447
+ this->stop_driver_();
475
448
  xEventGroupClearBits(this->event_group_, ALL_BITS);
449
+ this->status_clear_error();
450
+
476
451
  this->state_ = microphone::STATE_STOPPED;
477
452
  }
478
453
 
454
+ // Start the microphone if any semaphores are taken
479
455
  if ((uxSemaphoreGetCount(this->active_listeners_semaphore_) < MAX_LISTENERS) &&
480
456
  (this->state_ == microphone::STATE_STOPPED)) {
481
457
  this->state_ = microphone::STATE_STARTING;
482
458
  }
459
+
460
+ // Stop the microphone if all semaphores are returned
483
461
  if ((uxSemaphoreGetCount(this->active_listeners_semaphore_) == MAX_LISTENERS) &&
484
462
  (this->state_ == microphone::STATE_RUNNING)) {
485
463
  this->state_ = microphone::STATE_STOPPING;
@@ -487,14 +465,26 @@ void I2SAudioMicrophone::loop() {
487
465
 
488
466
  switch (this->state_) {
489
467
  case microphone::STATE_STARTING:
490
- if ((this->task_handle_ == nullptr) && !this->status_has_error()) {
468
+ if (this->status_has_error()) {
469
+ break;
470
+ }
471
+
472
+ if (!this->start_driver_()) {
473
+ this->status_momentary_error("I2S driver failed to start, unloading it and attempting again in 1 second", 1000);
474
+ this->stop_driver_(); // Stop/frees whatever possibly started
475
+ break;
476
+ }
477
+
478
+ if (this->task_handle_ == nullptr) {
491
479
  xTaskCreate(I2SAudioMicrophone::mic_task, "mic_task", TASK_STACK_SIZE, (void *) this, TASK_PRIORITY,
492
480
  &this->task_handle_);
493
481
 
494
482
  if (this->task_handle_ == nullptr) {
495
483
  this->status_momentary_error("Task failed to start, attempting again in 1 second", 1000);
484
+ this->stop_driver_(); // Stops the driver to return the lock; will be reloaded in next attempt
496
485
  }
497
486
  }
487
+
498
488
  break;
499
489
  case microphone::STATE_RUNNING:
500
490
  break;
@@ -43,7 +43,11 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub
43
43
  #endif
44
44
 
45
45
  protected:
46
+ /// @brief Starts the I2S driver. Updates the ``audio_stream_info_`` member variable with the current setttings.
47
+ /// @return True if succesful, false otherwise
46
48
  bool start_driver_();
49
+
50
+ /// @brief Stops the I2S driver.
47
51
  void stop_driver_();
48
52
 
49
53
  /// @brief Attempts to correct a microphone DC offset; e.g., a microphones silent level is offset from 0. Applies a
@@ -24,6 +24,7 @@ from esphome.const import (
24
24
  CONF_HARDWARE_UART,
25
25
  CONF_ID,
26
26
  CONF_LEVEL,
27
+ CONF_LOGGER,
27
28
  CONF_LOGS,
28
29
  CONF_ON_MESSAGE,
29
30
  CONF_TAG,
@@ -247,6 +248,7 @@ CONFIG_SCHEMA = cv.All(
247
248
  async def to_code(config):
248
249
  baud_rate = config[CONF_BAUD_RATE]
249
250
  level = config[CONF_LEVEL]
251
+ CORE.data.setdefault(CONF_LOGGER, {})[CONF_LEVEL] = level
250
252
  initial_level = LOG_LEVELS[config.get(CONF_INITIAL_LEVEL, level)]
251
253
  log = cg.new_Pvariable(
252
254
  config[CONF_ID],
@@ -212,9 +212,9 @@ class Logger : public Component {
212
212
  }
213
213
 
214
214
  // Format string to explicit buffer with varargs
215
- inline void printf_to_buffer_(const char *format, char *buffer, int *buffer_at, int buffer_size, ...) {
215
+ inline void printf_to_buffer_(char *buffer, int *buffer_at, int buffer_size, const char *format, ...) {
216
216
  va_list arg;
217
- va_start(arg, buffer_size);
217
+ va_start(arg, format);
218
218
  this->format_body_to_buffer_(buffer, buffer_at, buffer_size, format, arg);
219
219
  va_end(arg);
220
220
  }
@@ -312,13 +312,13 @@ class Logger : public Component {
312
312
  #if defined(USE_ESP32) || defined(USE_LIBRETINY)
313
313
  if (thread_name != nullptr) {
314
314
  // Non-main task with thread name
315
- this->printf_to_buffer_("%s[%s][%s:%03u]%s[%s]%s: ", buffer, buffer_at, buffer_size, color, letter, tag, line,
315
+ this->printf_to_buffer_(buffer, buffer_at, buffer_size, "%s[%s][%s:%03u]%s[%s]%s: ", color, letter, tag, line,
316
316
  ESPHOME_LOG_BOLD(ESPHOME_LOG_COLOR_RED), thread_name, color);
317
317
  return;
318
318
  }
319
319
  #endif
320
320
  // Main task or non ESP32/LibreTiny platform
321
- this->printf_to_buffer_("%s[%s][%s:%03u]: ", buffer, buffer_at, buffer_size, color, letter, tag, line);
321
+ this->printf_to_buffer_(buffer, buffer_at, buffer_size, "%s[%s][%s:%03u]: ", color, letter, tag, line);
322
322
  }
323
323
 
324
324
  inline void HOT format_body_to_buffer_(char *buffer, int *buffer_at, int buffer_size, const char *format,
@@ -5,7 +5,7 @@ from esphome.const import CONF_LEVEL, CONF_LOGGER, ENTITY_CATEGORY_CONFIG, ICON_
5
5
  from esphome.core import CORE
6
6
  from esphome.cpp_helpers import register_component, register_parented
7
7
 
8
- from .. import CONF_LOGGER_ID, LOG_LEVEL_SEVERITY, Logger, logger_ns
8
+ from .. import CONF_LOGGER_ID, LOG_LEVELS, Logger, logger_ns
9
9
 
10
10
  CODEOWNERS = ["@clydebarrow"]
11
11
 
@@ -21,9 +21,10 @@ CONFIG_SCHEMA = select.select_schema(
21
21
 
22
22
 
23
23
  async def to_code(config):
24
- levels = LOG_LEVEL_SEVERITY
25
- index = levels.index(CORE.config[CONF_LOGGER][CONF_LEVEL])
24
+ parent = await cg.get_variable(config[CONF_LOGGER_ID])
25
+ levels = list(LOG_LEVELS)
26
+ index = levels.index(CORE.data[CONF_LOGGER][CONF_LEVEL])
26
27
  levels = levels[: index + 1]
27
28
  var = await select.new_select(config, options=levels)
28
- await register_parented(var, config[CONF_LOGGER_ID])
29
+ await register_parented(var, parent)
29
30
  await register_component(var, config)
@@ -36,29 +36,43 @@ from .types import (
36
36
  # this will be populated later, in __init__.py to avoid circular imports.
37
37
  WIDGET_TYPES: dict = {}
38
38
 
39
+ TIME_TEXT_SCHEMA = cv.Schema(
40
+ {
41
+ cv.Required(CONF_TIME_FORMAT): cv.string,
42
+ cv.GenerateID(CONF_TIME): cv.templatable(cv.use_id(RealTimeClock)),
43
+ }
44
+ )
45
+
46
+ PRINTF_TEXT_SCHEMA = cv.All(
47
+ cv.Schema(
48
+ {
49
+ cv.Required(CONF_FORMAT): cv.string,
50
+ cv.Optional(CONF_ARGS, default=list): cv.ensure_list(cv.lambda_),
51
+ },
52
+ ),
53
+ validate_printf,
54
+ )
55
+
56
+
57
+ def _validate_text(value):
58
+ """
59
+ Do some sanity checking of the format to get better error messages
60
+ than using cv.Any
61
+ """
62
+ if value is None:
63
+ raise cv.Invalid("No text specified")
64
+ if isinstance(value, dict):
65
+ if CONF_TIME_FORMAT in value:
66
+ return TIME_TEXT_SCHEMA(value)
67
+ return PRINTF_TEXT_SCHEMA(value)
68
+
69
+ return cv.templatable(cv.string)(value)
70
+
71
+
39
72
  # A schema for text properties
40
73
  TEXT_SCHEMA = cv.Schema(
41
74
  {
42
- cv.Optional(CONF_TEXT): cv.Any(
43
- cv.All(
44
- cv.Schema(
45
- {
46
- cv.Required(CONF_FORMAT): cv.string,
47
- cv.Optional(CONF_ARGS, default=list): cv.ensure_list(
48
- cv.lambda_
49
- ),
50
- },
51
- ),
52
- validate_printf,
53
- ),
54
- cv.Schema(
55
- {
56
- cv.Required(CONF_TIME_FORMAT): cv.string,
57
- cv.GenerateID(CONF_TIME): cv.templatable(cv.use_id(RealTimeClock)),
58
- }
59
- ),
60
- cv.templatable(cv.string),
61
- )
75
+ cv.Optional(CONF_TEXT): _validate_text,
62
76
  }
63
77
  )
64
78
 
@@ -147,7 +147,11 @@ bool StreamingModel::perform_streaming_inference(const int8_t features[PREPROCES
147
147
  this->recent_streaming_probabilities_[this->last_n_index_] = output->data.uint8[0]; // probability;
148
148
  this->unprocessed_probability_status_ = true;
149
149
  }
150
- this->ignore_windows_ = std::min(this->ignore_windows_ + 1, 0);
150
+ if (this->recent_streaming_probabilities_[this->last_n_index_] < this->probability_cutoff_) {
151
+ // Only increment ignore windows if less than the probability cutoff; this forces the model to "cool-off" from a
152
+ // previous detection and calling ``reset_probabilities`` so it avoids duplicate detections
153
+ this->ignore_windows_ = std::min(this->ignore_windows_ + 1, 0);
154
+ }
151
155
  }
152
156
  return true;
153
157
  }
@@ -75,7 +75,7 @@ class PNGFormat(Format):
75
75
 
76
76
  def actions(self):
77
77
  cg.add_define("USE_ONLINE_IMAGE_PNG_SUPPORT")
78
- cg.add_library("pngle", "1.0.2")
78
+ cg.add_library("pngle", "1.1.0")
79
79
 
80
80
 
81
81
  IMAGE_FORMATS = {
@@ -34,12 +34,32 @@ static void init_callback(pngle_t *pngle, uint32_t w, uint32_t h) {
34
34
  * @param h The height of the rectangle to draw.
35
35
  * @param rgba The color to paint the rectangle in.
36
36
  */
37
- static void draw_callback(pngle_t *pngle, uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint8_t rgba[4]) {
37
+ static void draw_callback(pngle_t *pngle, uint32_t x, uint32_t y, uint32_t w, uint32_t h, const uint8_t rgba[4]) {
38
38
  PngDecoder *decoder = (PngDecoder *) pngle_get_user_data(pngle);
39
39
  Color color(rgba[0], rgba[1], rgba[2], rgba[3]);
40
40
  decoder->draw(x, y, w, h, color);
41
41
  }
42
42
 
43
+ PngDecoder::PngDecoder(OnlineImage *image) : ImageDecoder(image) {
44
+ {
45
+ pngle_t *pngle = this->allocator_.allocate(1, PNGLE_T_SIZE);
46
+ if (!pngle) {
47
+ ESP_LOGE(TAG, "Failed to allocate memory for PNGLE engine!");
48
+ return;
49
+ }
50
+ memset(pngle, 0, PNGLE_T_SIZE);
51
+ pngle_reset(pngle);
52
+ this->pngle_ = pngle;
53
+ }
54
+ }
55
+
56
+ PngDecoder::~PngDecoder() {
57
+ if (this->pngle_) {
58
+ pngle_reset(this->pngle_);
59
+ this->allocator_.deallocate(this->pngle_, PNGLE_T_SIZE);
60
+ }
61
+ }
62
+
43
63
  int PngDecoder::prepare(size_t download_size) {
44
64
  ImageDecoder::prepare(download_size);
45
65
  if (!this->pngle_) {
@@ -1,7 +1,8 @@
1
1
  #pragma once
2
2
 
3
- #include "image_decoder.h"
4
3
  #include "esphome/core/defines.h"
4
+ #include "esphome/core/helpers.h"
5
+ #include "image_decoder.h"
5
6
  #ifdef USE_ONLINE_IMAGE_PNG_SUPPORT
6
7
  #include <pngle.h>
7
8
 
@@ -18,13 +19,14 @@ class PngDecoder : public ImageDecoder {
18
19
  *
19
20
  * @param display The image to decode the stream into.
20
21
  */
21
- PngDecoder(OnlineImage *image) : ImageDecoder(image), pngle_(pngle_new()) {}
22
- ~PngDecoder() override { pngle_destroy(this->pngle_); }
22
+ PngDecoder(OnlineImage *image);
23
+ ~PngDecoder() override;
23
24
 
24
25
  int prepare(size_t download_size) override;
25
26
  int HOT decode(uint8_t *buffer, size_t size) override;
26
27
 
27
28
  protected:
29
+ RAMAllocator<pngle_t> allocator_;
28
30
  pngle_t *pngle_;
29
31
  };
30
32
 
@@ -8,7 +8,7 @@ namespace rp2040 {
8
8
 
9
9
  static const char *const TAG = "rp2040";
10
10
 
11
- static int IRAM_ATTR flags_to_mode(gpio::Flags flags, uint8_t pin) {
11
+ static int flags_to_mode(gpio::Flags flags, uint8_t pin) {
12
12
  if (flags == gpio::FLAG_INPUT) { // NOLINT(bugprone-branch-clone)
13
13
  return INPUT;
14
14
  } else if (flags == gpio::FLAG_OUTPUT) {
@@ -25,14 +25,16 @@ static int IRAM_ATTR flags_to_mode(gpio::Flags flags, uint8_t pin) {
25
25
  }
26
26
 
27
27
  struct ISRPinArg {
28
+ uint32_t mask;
28
29
  uint8_t pin;
29
30
  bool inverted;
30
31
  };
31
32
 
32
33
  ISRInternalGPIOPin RP2040GPIOPin::to_isr() const {
33
34
  auto *arg = new ISRPinArg{}; // NOLINT(cppcoreguidelines-owning-memory)
34
- arg->pin = pin_;
35
- arg->inverted = inverted_;
35
+ arg->pin = this->pin_;
36
+ arg->inverted = this->inverted_;
37
+ arg->mask = 1 << this->pin_;
36
38
  return ISRInternalGPIOPin((void *) arg);
37
39
  }
38
40
 
@@ -81,21 +83,36 @@ void RP2040GPIOPin::detach_interrupt() const { detachInterrupt(pin_); }
81
83
  using namespace rp2040;
82
84
 
83
85
  bool IRAM_ATTR ISRInternalGPIOPin::digital_read() {
84
- auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
85
- return bool(digitalRead(arg->pin)) != arg->inverted; // NOLINT
86
+ auto *arg = reinterpret_cast<ISRPinArg *>(this->arg_);
87
+ return bool(sio_hw->gpio_in & arg->mask) != arg->inverted;
86
88
  }
89
+
87
90
  void IRAM_ATTR ISRInternalGPIOPin::digital_write(bool value) {
88
- auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
89
- digitalWrite(arg->pin, value != arg->inverted ? 1 : 0); // NOLINT
91
+ auto *arg = reinterpret_cast<ISRPinArg *>(this->arg_);
92
+ if (value != arg->inverted) {
93
+ sio_hw->gpio_set = arg->mask;
94
+ } else {
95
+ sio_hw->gpio_clr = arg->mask;
96
+ }
90
97
  }
98
+
91
99
  void IRAM_ATTR ISRInternalGPIOPin::clear_interrupt() {
92
100
  // TODO: implement
93
101
  // auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
94
102
  // GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, 1UL << arg->pin);
95
103
  }
104
+
96
105
  void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) {
97
- auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
98
- pinMode(arg->pin, flags_to_mode(flags, arg->pin)); // NOLINT
106
+ auto *arg = reinterpret_cast<ISRPinArg *>(this->arg_);
107
+ if (flags & gpio::FLAG_OUTPUT) {
108
+ sio_hw->gpio_oe_set = arg->mask;
109
+ } else if (flags & gpio::FLAG_INPUT) {
110
+ sio_hw->gpio_oe_clr = arg->mask;
111
+ hw_write_masked(&padsbank0_hw->io[arg->pin],
112
+ (bool_to_bit(flags & gpio::FLAG_PULLUP) << PADS_BANK0_GPIO0_PUE_LSB) |
113
+ (bool_to_bit(flags & gpio::FLAG_PULLDOWN) << PADS_BANK0_GPIO0_PDE_LSB),
114
+ PADS_BANK0_GPIO0_PUE_BITS | PADS_BANK0_GPIO0_PDE_BITS);
115
+ }
99
116
  }
100
117
 
101
118
  } // namespace esphome
@@ -174,6 +174,16 @@ AudioPipelineState AudioPipeline::process_state() {
174
174
  }
175
175
  }
176
176
 
177
+ if ((event_bits & EventGroupBits::READER_MESSAGE_ERROR)) {
178
+ xEventGroupClearBits(this->event_group_, EventGroupBits::READER_MESSAGE_ERROR);
179
+ return AudioPipelineState::ERROR_READING;
180
+ }
181
+
182
+ if ((event_bits & EventGroupBits::DECODER_MESSAGE_ERROR)) {
183
+ xEventGroupClearBits(this->event_group_, EventGroupBits::DECODER_MESSAGE_ERROR);
184
+ return AudioPipelineState::ERROR_DECODING;
185
+ }
186
+
177
187
  if ((event_bits & EventGroupBits::READER_MESSAGE_FINISHED) &&
178
188
  (!(event_bits & EventGroupBits::READER_MESSAGE_LOADED_MEDIA_TYPE) &&
179
189
  (event_bits & EventGroupBits::DECODER_MESSAGE_FINISHED))) {
@@ -203,16 +213,6 @@ AudioPipelineState AudioPipeline::process_state() {
203
213
  return AudioPipelineState::STOPPED;
204
214
  }
205
215
 
206
- if ((event_bits & EventGroupBits::READER_MESSAGE_ERROR)) {
207
- xEventGroupClearBits(this->event_group_, EventGroupBits::READER_MESSAGE_ERROR);
208
- return AudioPipelineState::ERROR_READING;
209
- }
210
-
211
- if ((event_bits & EventGroupBits::DECODER_MESSAGE_ERROR)) {
212
- xEventGroupClearBits(this->event_group_, EventGroupBits::DECODER_MESSAGE_ERROR);
213
- return AudioPipelineState::ERROR_DECODING;
214
- }
215
-
216
216
  if (this->pause_state_) {
217
217
  return AudioPipelineState::PAUSED;
218
218
  }
@@ -54,8 +54,8 @@ async def to_code(config):
54
54
  cg.add(var.set_select_mappings(list(options_map.keys())))
55
55
  parent = await cg.get_variable(config[CONF_TUYA_ID])
56
56
  cg.add(var.set_tuya_parent(parent))
57
- if enum_datapoint := config.get(CONF_ENUM_DATAPOINT, None) is not None:
57
+ if (enum_datapoint := config.get(CONF_ENUM_DATAPOINT, None)) is not None:
58
58
  cg.add(var.set_select_id(enum_datapoint, False))
59
- if int_datapoint := config.get(CONF_INT_DATAPOINT, None) is not None:
59
+ if (int_datapoint := config.get(CONF_INT_DATAPOINT, None)) is not None:
60
60
  cg.add(var.set_select_id(int_datapoint, True))
61
61
  cg.add(var.set_optimistic(config[CONF_OPTIMISTIC]))
esphome/const.py CHANGED
@@ -1,6 +1,6 @@
1
1
  """Constants used by esphome."""
2
2
 
3
- __version__ = "2025.5.0b6"
3
+ __version__ = "2025.5.2"
4
4
 
5
5
  ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
6
6
  VALID_SUBSTITUTIONS_CHARACTERS = (
esphome/core/hal.h CHANGED
@@ -24,6 +24,11 @@
24
24
  #define PROGMEM ICACHE_RODATA_ATTR
25
25
  #endif
26
26
 
27
+ #elif defined(USE_RP2040)
28
+
29
+ #define IRAM_ATTR __attribute__((noinline, long_call, section(".time_critical")))
30
+ #define PROGMEM
31
+
27
32
  #else
28
33
 
29
34
  #define IRAM_ATTR
esphome/core/helpers.h CHANGED
@@ -1,6 +1,7 @@
1
1
  #pragma once
2
2
 
3
3
  #include <cmath>
4
+ #include <cstdint>
4
5
  #include <cstring>
5
6
  #include <functional>
6
7
  #include <limits>
esphome/core/string_ref.h CHANGED
@@ -1,5 +1,6 @@
1
1
  #pragma once
2
2
 
3
+ #include <cstdint>
3
4
  #include <cstring>
4
5
  #include <iterator>
5
6
  #include <memory>
@@ -601,10 +601,12 @@ class DownloadListRequestHandler(BaseHandler):
601
601
  loop = asyncio.get_running_loop()
602
602
  try:
603
603
  downloads_json = await loop.run_in_executor(None, self._get, configuration)
604
- except vol.Invalid:
604
+ except vol.Invalid as exc:
605
+ _LOGGER.exception("Error while fetching downloads", exc_info=exc)
605
606
  self.send_error(404)
606
607
  return
607
608
  if downloads_json is None:
609
+ _LOGGER.error("Configuration %s not found", configuration)
608
610
  self.send_error(404)
609
611
  return
610
612
  self.set_status(200)
@@ -618,14 +620,17 @@ class DownloadListRequestHandler(BaseHandler):
618
620
  if storage_json is None:
619
621
  return None
620
622
 
621
- config = yaml_util.load_yaml(settings.rel_path(configuration))
623
+ try:
624
+ config = yaml_util.load_yaml(settings.rel_path(configuration))
622
625
 
623
- if const.CONF_EXTERNAL_COMPONENTS in config:
624
- from esphome.components.external_components import (
625
- do_external_components_pass,
626
- )
626
+ if const.CONF_EXTERNAL_COMPONENTS in config:
627
+ from esphome.components.external_components import (
628
+ do_external_components_pass,
629
+ )
627
630
 
628
- do_external_components_pass(config)
631
+ do_external_components_pass(config)
632
+ except vol.Invalid:
633
+ _LOGGER.info("Could not parse `external_components`, skipping")
629
634
 
630
635
  from esphome.components.esp32 import VARIANTS as ESP32_VARIANTS
631
636
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: esphome
3
- Version: 2025.5.0b6
3
+ Version: 2025.5.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=GePHUM7xdXb_Pil59SHVsXg2F4VBPgkH-Fz2PDX8Z54,1873
5
5
  esphome/config.py,sha256=-SoMrYNlKL85sYK_t_UQXKEKm-xrZYhyRqwiUpBXyXE,39896
6
6
  esphome/config_helpers.py,sha256=MKf_wzO35nn41FvigXE0iYKDslPgL2ruf8R-EPtTT2I,3256
7
7
  esphome/config_validation.py,sha256=vEDw3u5jfyZbELimFLjTK5YuupBwKI8Np8HUo7oqpoo,61434
8
- esphome/const.py,sha256=z8MZoQ3buzPapKv7JbgoThPie_p0bu_MEQuRZDBhKs8,41482
8
+ esphome/const.py,sha256=nNM-1r_zEencdJk5_U17zc8N4Squb0F_Zo3FLL6g32U,41480
9
9
  esphome/coroutine.py,sha256=j_14z8dIIzIBeuNO30D4c1RJvMMt1xZFZ58Evd-EvJA,9344
10
10
  esphome/cpp_generator.py,sha256=39sLZ_f7UKrTOKKG5PVNQ6ucSRJFP0FYEhDN82DCO6Y,31377
11
11
  esphome/cpp_helpers.py,sha256=6C2vNbOIhZKi43xRVlk5hp9GfshfBn-rc5D_ZFUEYaE,4801
@@ -182,7 +182,7 @@ esphome/components/apds9960/apds9960.h,sha256=oFrXPQrPDS16gNSVdN1n6SKuvjwc9LdvpK
182
182
  esphome/components/apds9960/binary_sensor.py,sha256=MvCYb6pTgOU48TMm_YhN6uHKkoFKFvhma3lwQQD9xfM,787
183
183
  esphome/components/apds9960/sensor.py,sha256=vUPm5H_IFROftGlMJWfgqSzm0IeLpYh5DvtA_DL1Amk,872
184
184
  esphome/components/api/__init__.py,sha256=eDf1EuKrpeQ9bu3KDim5VvwDaAekzBGFXQJV50mPXf4,10459
185
- esphome/components/api/api_connection.cpp,sha256=OkutLz8Yg0ybxQJoXTVRpzpsJng8NZ1MnyjUEdbEfN8,68927
185
+ esphome/components/api/api_connection.cpp,sha256=JTQC3LIV5VG8BbJDcGckbIed1gC8FhU5yKyN43nmtUc,69030
186
186
  esphome/components/api/api_connection.h,sha256=JvnTtRbBOJatkjeAra--7MY72cQooeiYo7B3paOKhg4,21419
187
187
  esphome/components/api/api_frame_helper.cpp,sha256=bFmRYeRiIXxyevKcziDvjKjI0ofvFT5-44U0Ux6zJDA,38336
188
188
  esphome/components/api/api_frame_helper.h,sha256=TT3s7f4tWwhEJ9yhB2osU9R7f34MD8MO6EFAOeyq0Zk,8214
@@ -644,7 +644,7 @@ esphome/components/datetime/datetime_entity.h,sha256=qN4CuohdTVq5g0VKrl8whUE1FjF
644
644
  esphome/components/datetime/time_entity.cpp,sha256=k9ZEtOs4SIO3GCwc-SmKExwYiiyDDqra5Lxw6b7fW2M,4403
645
645
  esphome/components/datetime/time_entity.h,sha256=rNN9V8UH4ervs03lsuvR233dD13LYceAy597vXbURcY,2915
646
646
  esphome/components/debug/__init__.py,sha256=llo39yz0GH4Lo10IIVJfwna6okFO4g4-L0D1dStlK5U,1463
647
- esphome/components/debug/debug_component.cpp,sha256=KHrSIDf_fldO_UVdU1KbQNAmOMFc5Mp6GLki5nmvfp0,3130
647
+ esphome/components/debug/debug_component.cpp,sha256=aW9jdJpsVBkPbAEyrRZJwKo_8hoAsGwUyazwikdinGs,3033
648
648
  esphome/components/debug/debug_component.h,sha256=rhAbHVHngj9rtH33UDJ8Yg1CkxyS8iHlRAkDcvXqBcQ,3088
649
649
  esphome/components/debug/debug_esp32.cpp,sha256=X3-yqAeneoLn5feAgnjxLhtFgm70QdTEY9QL7d-YhjY,7004
650
650
  esphome/components/debug/debug_esp8266.cpp,sha256=eTj_cCcsHgG5YgtryxZFmM1bN2mHRXLEC1qPkfBDdDY,3145
@@ -799,7 +799,7 @@ esphome/components/es8311/es8311_const.h,sha256=bUBF4DJ28DcLPHznvh30Guewi65mSqQb
799
799
  esphome/components/esp32/__init__.py,sha256=69TidRc1h15dsAP4Mrx7dnAJGpumJKsYr50Fc-kg25E,33238
800
800
  esphome/components/esp32/boards.py,sha256=BSabIM_DaDXFkPvGemv_3mcqFgEUt2lAnxN5EFpCO9U,52725
801
801
  esphome/components/esp32/const.py,sha256=2yxLQg3p2-S3nRL6-zsF_dICrP_6waUfY5k8EFsoyVM,966
802
- esphome/components/esp32/core.cpp,sha256=ACJvAXS9GaW5pXKhera-kdrx3s_wPULjkja444MSV1s,2633
802
+ esphome/components/esp32/core.cpp,sha256=7O7S5bJPNUeX8ge1mxpyZ1WzxTf1fFDCRK3P5UxZvq8,2865
803
803
  esphome/components/esp32/gpio.cpp,sha256=29SanxYKoiTw2sdn93X5Y0uigKJlhaApu6Jc-pJLXpY,6607
804
804
  esphome/components/esp32/gpio.h,sha256=fIPLaMPSodwS4anI4DdOrWPee3pHR3GLHLSTlwPuRzY,1298
805
805
  esphome/components/esp32/gpio.py,sha256=18VkjM_PA_Ux7jV_XG6HDLYGO9bj5vPUBTvU_rcP6GY,7229
@@ -886,7 +886,7 @@ esphome/components/esp8266/boards.py,sha256=p2btoDa36gfr9QsCOBZuME7Pi20Xf2LcQ_F-
886
886
  esphome/components/esp8266/const.py,sha256=bBUPq-_hzl36vVhKwCxCI_2TSNLJZpwbs6MtgHLVATI,380
887
887
  esphome/components/esp8266/core.cpp,sha256=IMhgyjd1a5Jm0j1wsUKcv6eme8A4_IdFdvPjX0QXNzE,2673
888
888
  esphome/components/esp8266/core.h,sha256=Gt8v8q9LxxHbKjf445vOk1iYXnRYCl4VogI7sdUQuMM,287
889
- esphome/components/esp8266/gpio.cpp,sha256=owUsfvd_eKiUn_cDLdHhP0F03kHvVnfuYfnsN8loJ2Y,4662
889
+ esphome/components/esp8266/gpio.cpp,sha256=EEpDKxujguHbdMuCe9TtFAChmi6se8-Etumf6EkpuEI,4986
890
890
  esphome/components/esp8266/gpio.h,sha256=drRteE3plCa62g9xm25cXu1CngCh-SQh2eNduCRuJCs,1060
891
891
  esphome/components/esp8266/gpio.py,sha256=A2vOhpFK2674x2OJ8Ruy_c-Xfe2CWPVy2N3c4OBGYk4,6368
892
892
  esphome/components/esp8266/post_build.py.script,sha256=Hca2nrttn2jdYmFVnNxsgMNlEFk2pg8GKMB6CTppR_k,703
@@ -1238,8 +1238,8 @@ esphome/components/i2s_audio/media_player/__init__.py,sha256=Is8GpC8A6eTDCdNCes3
1238
1238
  esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp,sha256=OlvkjzYSdaxIjJiQF-BbjThoY91_rvGJ4woRjyB9mwY,7538
1239
1239
  esphome/components/i2s_audio/media_player/i2s_audio_media_player.h,sha256=gmG6n9YU2Mz85CFa3fO7Na2KBdt9fOrGbDg0-C7jwjI,2078
1240
1240
  esphome/components/i2s_audio/microphone/__init__.py,sha256=m62jL72XwxBavk9cDULs2cdcbHHkM96JF5RPiPBHGcg,4281
1241
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp,sha256=Ak__GS9y0Ev0a6KLDuJgRoyOwdhGFJ7Um6BwcdEhI-k,16662
1242
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.h,sha256=E6MTRHS4tGu5DGXCnilTW5-kj-2b8gAMI5RfOwNESaM,2148
1241
+ esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp,sha256=yQ5b_bVg-2zNqfdunJL_8eeEzE97llg-JZV_DkgwNQM,16648
1242
+ esphome/components/i2s_audio/microphone/i2s_audio_microphone.h,sha256=QefL91wL9KHO6pN5DCxbrYNV1KsYGmR9cG8CosUe0pY,2348
1243
1243
  esphome/components/i2s_audio/speaker/__init__.py,sha256=EUWTtCtc3T5zoaHMUnqu-KjJh5nnwKrkUAQi3QYEDi0,6152
1244
1244
  esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp,sha256=vgdKk-CdPC4IuspdcJpypSv5L49fiqZ3ZtjKfTz4dmI,26865
1245
1245
  esphome/components/i2s_audio/speaker/i2s_audio_speaker.h,sha256=VqfZH3A4ZgqeXuhJuiBhGsERKthxF4eJB1HCYDBvU0s,6666
@@ -1498,9 +1498,9 @@ esphome/components/lock/__init__.py,sha256=Ggh0T9KdTDyqmAeDzbmAYxnJzVVWkij2KylJt
1498
1498
  esphome/components/lock/automation.h,sha256=7MU5AuJizydt7mKTr_uFsNleFI2jeBf7B_dNp3e8Fks,1771
1499
1499
  esphome/components/lock/lock.cpp,sha256=IyEt5xShAxMpmcn_GAPFv2lRCS-kr4MjjfExxfXuK-Q,3212
1500
1500
  esphome/components/lock/lock.h,sha256=kFFccTAu56e6PhZVATW0NznOj0M7VByEn9gc6l5M3eA,6042
1501
- esphome/components/logger/__init__.py,sha256=aqw-pN0QJ6J9OgqHFdnfuk6tPchfqVcVn2gFfyVuwAY,14743
1501
+ esphome/components/logger/__init__.py,sha256=OOKS7yGtVaqIBoA0Y36mwNlK2H8182uDdy4cGPZwajA,14822
1502
1502
  esphome/components/logger/logger.cpp,sha256=9dxWxuHgWpwMiD27CuQgXbkGMiC3Uc84iglwj67OSP0,10485
1503
- esphome/components/logger/logger.h,sha256=73V1H5FoZCpFmVUGlNG2FNev4Zgp7F9tFBhnOKdMrD8,13021
1503
+ esphome/components/logger/logger.h,sha256=653__PTXxyfs2_vR4QK0feZhYXPPMxsmP4DYz-Vz-lE,13016
1504
1504
  esphome/components/logger/logger_esp32.cpp,sha256=SOLN5oHiVbnItxw4wdhvNdeunwgY7FR5j752fEt9__M,6101
1505
1505
  esphome/components/logger/logger_esp8266.cpp,sha256=k7GvUlcLxXCVYqBw7tlHRikmRe7hdO6qV837wr4N2ww,1182
1506
1506
  esphome/components/logger/logger_host.cpp,sha256=h3Its8pHiVvnyOc6rj5zRiug8rLi42f5QTQiTbBiCNo,450
@@ -1508,7 +1508,7 @@ esphome/components/logger/logger_libretiny.cpp,sha256=-GTn0YT2m2X2JS4H2R6w7kXUWz
1508
1508
  esphome/components/logger/logger_rp2040.cpp,sha256=7X29d8hO65NIYS7fZoeyCR0oXC2LQcNuSAFtlvSniYw,991
1509
1509
  esphome/components/logger/task_log_buffer.cpp,sha256=De8xetK8CYpQtjyt0jashw97IejgtRdBcuT1uHOmnPo,4616
1510
1510
  esphome/components/logger/task_log_buffer.h,sha256=6E-H7Pe914Y-kPpfJJWlN7xtHoIPUpwoCNMCkrp1S4Y,2670
1511
- esphome/components/logger/select/__init__.py,sha256=v1Q-6bYRZRd_VXRF93kcqDCvY0x3fuYzJrkCq-uqzoE,991
1511
+ esphome/components/logger/select/__init__.py,sha256=a24OApXDycQ2ZtUrWtbdVpwicKRIhGqpJSyibhCQ6eE,1022
1512
1512
  esphome/components/logger/select/logger_level_select.cpp,sha256=VTInyo463i-Qoin4c251e0nXKhsgTkixlQ1rwE1EC3s,627
1513
1513
  esphome/components/logger/select/logger_level_select.h,sha256=rjUmIsZKszI8fK4FH--jkpmW4aDMNewiz8GOQoCtyn8,442
1514
1514
  esphome/components/ltr390/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1540,7 +1540,7 @@ esphome/components/lvgl/lvgl_esphome.cpp,sha256=YqbEb-zHjPptK9H9x157ozIJIpiefho0
1540
1540
  esphome/components/lvgl/lvgl_esphome.h,sha256=8a5DaKfK0jWa1dQsA0bC0aw_RoPrLXC5vcBzVi4CCXU,13927
1541
1541
  esphome/components/lvgl/lvgl_hal.h,sha256=aZqWpSmKKAB-ZfNxxgxjgASTtLpAZjXJKuoTiPB0qqU,431
1542
1542
  esphome/components/lvgl/lvgl_proxy.h,sha256=JPmVBVh5zD5nraJCN7PqXVmQQlc4CPJe_X9tA6IAtXQ,547
1543
- esphome/components/lvgl/schemas.py,sha256=NhbLKOS93LT4MWYmIP63VqaxamqzLx24GnFiPeVhg0A,16227
1543
+ esphome/components/lvgl/schemas.py,sha256=QySqz2vz4pON2HSBCHp-8tH19T7xrVUvRyoB3820aos,16398
1544
1544
  esphome/components/lvgl/styles.py,sha256=HTqSzCIy2WUZhhChafVhBeVEemWqFfNyWtXII34XI7k,3010
1545
1545
  esphome/components/lvgl/touchscreens.py,sha256=CntwVa1EUu6iBnxfvuv0rCYd_Njmf451CYdRqQyb9N4,1607
1546
1546
  esphome/components/lvgl/trigger.py,sha256=nk36OgqEQWuSwFsTHprM-bhIjh15bh3NyrsK-ffqGsw,3442
@@ -1741,7 +1741,7 @@ esphome/components/micro_wake_word/automation.h,sha256=7Wx_ys9SK_coI1ychdtHTkxyE
1741
1741
  esphome/components/micro_wake_word/micro_wake_word.cpp,sha256=vNqDK32iVXHxxa9UF7NrN_hHWsatRkirM-RtrzioDXU,17495
1742
1742
  esphome/components/micro_wake_word/micro_wake_word.h,sha256=OUgT_KQB4Lr9JWuSKAn1PgtlhhR5f98LKoIzFL-nzyI,4200
1743
1743
  esphome/components/micro_wake_word/preprocessor_settings.h,sha256=q-bNGC0UjUmx4WVvjI-T3RhPJHiMoT65NSlBs2YRX8s,1299
1744
- esphome/components/micro_wake_word/streaming_model.cpp,sha256=Ssug0HYwwMmaAxzqQvQO_9isX8J18zkaUUxbOw7z2iE,10481
1744
+ esphome/components/micro_wake_word/streaming_model.cpp,sha256=fsVovrBmKkF6wLPbDzIH3aoQDbFGDb-T4mdzQU-GFIU,10804
1745
1745
  esphome/components/micro_wake_word/streaming_model.h,sha256=2AT76eAKIGqtEFiNtsMARTTVOXxjjjRnxgYBZOumdM0,6170
1746
1746
  esphome/components/micronova/__init__.py,sha256=iPElnW5XWXLEvZe1wWqgbRY_xhqiQNI7SB521tVJkXI,2668
1747
1747
  esphome/components/micronova/micronova.cpp,sha256=gc0xDasM0sBvU6BNnT24ArBJ1bgrnoPcq9dWLuFbTD8,5297
@@ -2051,7 +2051,7 @@ esphome/components/one_wire/one_wire.cpp,sha256=bkAEEIDm3cCPM4RqDs-ZSZ4Moxbm7Fm8
2051
2051
  esphome/components/one_wire/one_wire.h,sha256=QyYHANwfSz3xx9EKFtgxi2VRlzSQdfubyWXqZcuIzPI,1249
2052
2052
  esphome/components/one_wire/one_wire_bus.cpp,sha256=gDFELdtwfDzOFevUJplZReGTSd8ggtxMZlysIOaunEw,2374
2053
2053
  esphome/components/one_wire/one_wire_bus.h,sha256=eFNPYr6zduzj3HPiR4OIl6rzeWbN06E2BiPMws6NsFc,1626
2054
- esphome/components/online_image/__init__.py,sha256=Xq5yjzakmBtOmX-F354EXds6A9l0K7QUWNbuOyn0Bao,6231
2054
+ esphome/components/online_image/__init__.py,sha256=4MHDLi0iGBTuDS3ns5EjkaiTcN6Qr2q-cRD1_il1z2c,6231
2055
2055
  esphome/components/online_image/bmp_image.cpp,sha256=3juptNvpk8tL5iyOlB2hKsJRPOH47Rn5liDBn1Cpi-s,4513
2056
2056
  esphome/components/online_image/bmp_image.h,sha256=oOqxJ_6eC_73pQ5funjNB36tYWUZkHPagoo0XWJe_v8,933
2057
2057
  esphome/components/online_image/image_decoder.cpp,sha256=p_693Ac8F-vs2n_1AZ7E57HBfLhAeeBWYpI3tDy6rnE,2215
@@ -2060,8 +2060,8 @@ esphome/components/online_image/jpeg_image.cpp,sha256=1qDTfzp7H6oxuRVBVXXgglourm
2060
2060
  esphome/components/online_image/jpeg_image.h,sha256=RxlXrSxgd_j7tXYMGdkU1gVmkWB6Jc0YHuq13NrY9fc,741
2061
2061
  esphome/components/online_image/online_image.cpp,sha256=NpXUoKdbIJRdPcY5tQ-fxa6WLpTYeRs8sHJnNP2M2pA,10585
2062
2062
  esphome/components/online_image/online_image.h,sha256=40F0zWRI0p6A8pFfQdQ1eD5tnwgCxBDbeNcpCHgeUzk,7177
2063
- esphome/components/online_image/png_image.cpp,sha256=ysXfjX05YPuZaG0wxHg0EiPlj3HlddQqUdDG25W1jpY,2432
2064
- esphome/components/online_image/png_image.h,sha256=oDyTIkyOB2MiKxZ9YmctwN7sbc_E7Qz0PvFxWg9Lip8,783
2063
+ esphome/components/online_image/png_image.cpp,sha256=HjglIePX4mMDlXMVjxfJJagYGLpnZCH9kyF-gH9BIc0,2922
2064
+ esphome/components/online_image/png_image.h,sha256=8hu7kw5nCP_uFSRk8JItr3_zZoXMSoe-xFV7Omd0H_c,776
2065
2065
  esphome/components/opentherm/__init__.py,sha256=akuY6Z1QUybE_yrD3Yg6_GWQDQE5U5nO018OBxSCMco,5479
2066
2066
  esphome/components/opentherm/automation.h,sha256=7Ob3hTNE0lwAO7jdJf2nuTzTPU__FI5psfn8j-4edsQ,627
2067
2067
  esphome/components/opentherm/const.py,sha256=MercQyNt4vj245_74-O-ZULGjq19jux99aVFteiEVEU,244
@@ -2442,7 +2442,7 @@ esphome/components/rp2040/build_pio.py.script,sha256=aNtrSnjYcLY6t0NYBGszhwMPISV
2442
2442
  esphome/components/rp2040/const.py,sha256=1x4XQlMfgQux1bllBAhz9ym-aUeFglxtPnQbpG3vUYQ,147
2443
2443
  esphome/components/rp2040/core.cpp,sha256=hGPbOW4w5O3r04isZeAZtL2zWbe-sNf0TV7_7u1Sgzo,937
2444
2444
  esphome/components/rp2040/core.h,sha256=YA4WtdKTdnZxkpOUF4GwT3KMjsbFjH6j0y42EvetLFA,239
2445
- esphome/components/rp2040/gpio.cpp,sha256=_EkccW4ZuUW7HVJxaVgCqYA4z0h4MDf0SGLDYD7jW-M,3002
2445
+ esphome/components/rp2040/gpio.cpp,sha256=8aewN0-fqru1W7zj_g6hnhh9gjMKOIMamGIzSZkbozU,3516
2446
2446
  esphome/components/rp2040/gpio.h,sha256=xIaLyJ0GLs2uNVxnYXweixWDW0nZ5bHmGCdCWQI55tA,1055
2447
2447
  esphome/components/rp2040/gpio.py,sha256=HTZYi8manLRjLcEOwwSd7tTTEKa7btRco-gYQYudN7I,2913
2448
2448
  esphome/components/rp2040/post_build.py.script,sha256=JgNm6aGGA9LYGZEjzqr8EHiugKLU6h7fmmXFAhdBleI,699
@@ -2741,7 +2741,7 @@ esphome/components/speaker/__init__.py,sha256=2juDem8QadLMwzFp8Rvl-KeIbE-iIEsCtD
2741
2741
  esphome/components/speaker/automation.h,sha256=tVSTV49GvHk0bCEgLz3rNYFe8B1F0kXLgE-WihuRaV8,2320
2742
2742
  esphome/components/speaker/speaker.h,sha256=Y6EuDzsIx8GDcFeWnYXg4cXiBU-6CkmrRCaMpXQYiWo,4355
2743
2743
  esphome/components/speaker/media_player/__init__.py,sha256=bVvoKj9yiG0MOWFrMLAwnxdNjq8kxqUYRuokiCv7m4c,15264
2744
- esphome/components/speaker/media_player/audio_pipeline.cpp,sha256=KCo7Ujy9IZsViBQ4WotYJ3OrjwaNx7iXH1j6A9NRcww,22362
2744
+ esphome/components/speaker/media_player/audio_pipeline.cpp,sha256=UYIc3ntV98vTADPj7CJLerSguhVQGScCOdtCOdMZ0pU,22362
2745
2745
  esphome/components/speaker/media_player/audio_pipeline.h,sha256=MYt7_kp4IJDSTnXWqLaXIkbbNkGx6F_imSryFo2UUkc,5000
2746
2746
  esphome/components/speaker/media_player/automation.h,sha256=I8psUHnJ8T3fkM05h1yEYDxb0yWe6Vjz7i30OSVA3Is,683
2747
2747
  esphome/components/speaker/media_player/speaker_media_player.cpp,sha256=JpsDQjfEPZHuTofYzCcM92H5KkULyrua_z63mORqnDU,22668
@@ -3146,7 +3146,7 @@ esphome/components/tuya/light/tuya_light.h,sha256=uZ6FGnQ8IVXI6G7GpXs_QDcEzudqct
3146
3146
  esphome/components/tuya/number/__init__.py,sha256=IJkUx89TiMNS2IwTLk6h_awtXqYP97wgWYw-ENGNq0Y,3188
3147
3147
  esphome/components/tuya/number/tuya_number.cpp,sha256=hsTOxp3yV7CXeIXKzaShMuloSFHbHpyzJYP0EaNShnk,3084
3148
3148
  esphome/components/tuya/number/tuya_number.h,sha256=scGw2WHoxcRkjwoLyW7yKNc2ZRVf4BeWnWnOYdWA7qQ,1125
3149
- esphome/components/tuya/select/__init__.py,sha256=nETAOB8I9-g5AhJ9GxqF7kS7ojQp3hBKNCqIV94NXgg,2015
3149
+ esphome/components/tuya/select/__init__.py,sha256=MGCSbYVB3JFJieImChsNAdQ07Shwzi-l6tJX5tNZB6Q,2019
3150
3150
  esphome/components/tuya/select/tuya_select.cpp,sha256=7D2NQX29LDndyWzroQVjq2k9uQ4BtivtHmsUS98FdEw,1893
3151
3151
  esphome/components/tuya/select/tuya_select.h,sha256=QQI1gglXhgfYri9CRc5sxzVHg2UVZFDyKYoBwMr5WPw,924
3152
3152
  esphome/components/tuya/sensor/__init__.py,sha256=H301WiiVq8f3F84PJpJZojRgHnmW9TpLZwMLmLfpJB4,903
@@ -3503,9 +3503,9 @@ esphome/core/entity_base.cpp,sha256=uh9DdAAkCxmVVhelBtqkiGW4_P9gDcZMBuwFDSIEqEQ,
3503
3503
  esphome/core/entity_base.h,sha256=y9pPjHUxtiadpSzUroBp8-YomztwZnzPVS6GF33YI3U,2831
3504
3504
  esphome/core/entity_helpers.py,sha256=s5lYCG5hu_1SROtSWgzI0T6802l5-I8udGy1_6HNSdc,2337
3505
3505
  esphome/core/gpio.h,sha256=kLkCnPxu4_1CsLR4BI_Baj1lDGoRIh8uubbwsIkJPIA,2575
3506
- esphome/core/hal.h,sha256=e3qFkax3jfncEusf3kwXCts0Ai7D4XspJgh-VqVDcK4,844
3506
+ esphome/core/hal.h,sha256=Le0-vtdDylYCaE9i4yvrv5-Y5PB5xoL3PM2FfMJsIeA,970
3507
3507
  esphome/core/helpers.cpp,sha256=jdQr3nSMOj6bIFColDaxMa3_BsyL4gHi0FzeXNY5-rw,25140
3508
- esphome/core/helpers.h,sha256=Glb9nMEmRl9rQElEy8sXkqNmUdwHdnGA4raehWkB8wI,30298
3508
+ esphome/core/helpers.h,sha256=qGssN0aPZbEyt8PrqZ-I8bd_N7RuBN4KhzM-qdkagPA,30317
3509
3509
  esphome/core/log.cpp,sha256=MDCx87ytW6Fz6basxYUpagkubFzUKO1ysvU5RXbXoII,1581
3510
3510
  esphome/core/log.h,sha256=hnRVgv7LjfmCpFAFa5Trt_HmmChAm64j8a9c_N3GQXw,6493
3511
3511
  esphome/core/macros.h,sha256=yNx3-Dq7tSRe40Ip_Kbhp9e6w7oDhxlWlGBDLRlZaUI,244
@@ -3516,7 +3516,7 @@ esphome/core/ring_buffer.h,sha256=4SeN2DYZLCHrLIjSPDsiAynIjwOoItiRUDO-u1wjq-o,29
3516
3516
  esphome/core/scheduler.cpp,sha256=RUoEer5bFG8e7AH5sKa_aeeVyGHYIhOnpv6P5lNDIWw,11179
3517
3517
  esphome/core/scheduler.h,sha256=zdC14yXpXrj54c4kUQMqDmnEHBdJlfrTLR1YRfPQDtE,2161
3518
3518
  esphome/core/string_ref.cpp,sha256=of1TYMY6t3t4HjjPLSiItuPSa62AMG0lK_CU2HS1RvM,242
3519
- esphome/core/string_ref.h,sha256=uPLS1v13VMOltkXO3bL3owdX9P3s9CMnhVtkaphTdDQ,5208
3519
+ esphome/core/string_ref.h,sha256=Rd8HVBiUZrPA3TkPCwuAxGw91VX-e3Fky812OCNhNvA,5227
3520
3520
  esphome/core/time.cpp,sha256=70xJvr0_ytMWtkxyT8gSkGgPGekzKiKUs08-7-FHNd0,7602
3521
3521
  esphome/core/time.h,sha256=aQd7M_tO2X5ErvjTxpB6LmvdwJQjGlEfaqYe8rMkYWY,4347
3522
3522
  esphome/core/util.cpp,sha256=gbTBqOdLxWIxv9h8HFrLPZ96HZI6PBY-WBB_gdiqEts,774
@@ -3530,7 +3530,7 @@ esphome/dashboard/dns.py,sha256=VrItOGoZO1xBUQr3AXekYtGzzpPxCfxB7h97qt7ixk0,1545
3530
3530
  esphome/dashboard/entries.py,sha256=SWKJRQ7Zrm9dNm_yt34Ws1RY7rN1YgQysuU0lId7fq8,15666
3531
3531
  esphome/dashboard/enum.py,sha256=rlQFVVxyBt5Iw7OL0o9F8D5LGgw23tbvi-KYjzP0QUQ,597
3532
3532
  esphome/dashboard/settings.py,sha256=1iIGNTgU7xg6xvjazHYq8UHC6JXocKjKlsed0cQ-nkw,2858
3533
- esphome/dashboard/web_server.py,sha256=0y10H6tnPzSHh9x7UdBkz1I9F2JDQ-DAQ9DB8NR79kI,43417
3533
+ esphome/dashboard/web_server.py,sha256=j5VGWK0A3phInRgMAo_cXCUbOmRqM2BzDXaJd15xgfQ,43714
3534
3534
  esphome/dashboard/status/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3535
3535
  esphome/dashboard/status/mdns.py,sha256=jAjLuysjr29HUGA0Y_IQp4D1Qm-d3yHdHY6K00gUCD4,4775
3536
3536
  esphome/dashboard/status/mqtt.py,sha256=2QOq1vgwJCHW5uL_hqmi_R5fX5OTeTJUHx7c0pMLQKE,2578
@@ -3541,9 +3541,9 @@ esphome/dashboard/util/itertools.py,sha256=8eLrWEWmICLtXNxkKdYPQV0c_N4GEz8m9Npnb
3541
3541
  esphome/dashboard/util/password.py,sha256=cQz3b9B-ijTe7zS6BeCW0hc3pWv6JjC78jmnycYYAh8,321
3542
3542
  esphome/dashboard/util/subprocess.py,sha256=T8EW6dbU4LPd2DG1dRrdh8li71tt6J1isn411poMhkk,1022
3543
3543
  esphome/dashboard/util/text.py,sha256=ENDnfN4O0NdA3CKVJjQYabFbwbrsIhVKrAMQe53qYu4,534
3544
- esphome-2025.5.0b6.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3545
- esphome-2025.5.0b6.dist-info/METADATA,sha256=juubwFWfs4-YMLyGr0_9ZgEbuIkLZIZupcqKS7PIb7I,3626
3546
- esphome-2025.5.0b6.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
3547
- esphome-2025.5.0b6.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3548
- esphome-2025.5.0b6.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3549
- esphome-2025.5.0b6.dist-info/RECORD,,
3544
+ esphome-2025.5.2.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3545
+ esphome-2025.5.2.dist-info/METADATA,sha256=t1I9qsH4YynvZFulQpJoHcLWUuWE8JLyjxVekPJz_sQ,3624
3546
+ esphome-2025.5.2.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
3547
+ esphome-2025.5.2.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3548
+ esphome-2025.5.2.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3549
+ esphome-2025.5.2.dist-info/RECORD,,