esphome 2025.7.0b5__py3-none-any.whl → 2025.7.1__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.

@@ -11,6 +11,15 @@ namespace esphome {
11
11
  namespace api {
12
12
 
13
13
  template<typename... X> class TemplatableStringValue : public TemplatableValue<std::string, X...> {
14
+ private:
15
+ // Helper to convert value to string - handles the case where value is already a string
16
+ template<typename T> static std::string value_to_string(T &&val) { return to_string(std::forward<T>(val)); }
17
+
18
+ // Overloads for string types - needed because std::to_string doesn't support them
19
+ static std::string value_to_string(const char *val) { return std::string(val); } // For lambdas returning .c_str()
20
+ static std::string value_to_string(const std::string &val) { return val; }
21
+ static std::string value_to_string(std::string &&val) { return std::move(val); }
22
+
14
23
  public:
15
24
  TemplatableStringValue() : TemplatableValue<std::string, X...>() {}
16
25
 
@@ -19,7 +28,7 @@ template<typename... X> class TemplatableStringValue : public TemplatableValue<s
19
28
 
20
29
  template<typename F, enable_if_t<is_invocable<F, X...>::value, int> = 0>
21
30
  TemplatableStringValue(F f)
22
- : TemplatableValue<std::string, X...>([f](X... x) -> std::string { return to_string(f(x...)); }) {}
31
+ : TemplatableValue<std::string, X...>([f](X... x) -> std::string { return value_to_string(f(x...)); }) {}
23
32
  };
24
33
 
25
34
  template<typename... Ts> class TemplatableKeyValuePair {
@@ -4,6 +4,7 @@
4
4
  #include "esphome/components/network/ip_address.h"
5
5
  #include "esphome/core/log.h"
6
6
  #include "esphome/core/util.h"
7
+ #include "esphome/core/helpers.h"
7
8
 
8
9
  #include <lwip/igmp.h>
9
10
  #include <lwip/init.h>
@@ -71,7 +72,11 @@ bool E131Component::join_igmp_groups_() {
71
72
  ip4_addr_t multicast_addr =
72
73
  network::IPAddress(239, 255, ((universe.first >> 8) & 0xff), ((universe.first >> 0) & 0xff));
73
74
 
74
- auto err = igmp_joingroup(IP4_ADDR_ANY4, &multicast_addr);
75
+ err_t err;
76
+ {
77
+ LwIPLock lock;
78
+ err = igmp_joingroup(IP4_ADDR_ANY4, &multicast_addr);
79
+ }
75
80
 
76
81
  if (err) {
77
82
  ESP_LOGW(TAG, "IGMP join for %d universe of E1.31 failed. Multicast might not work.", universe.first);
@@ -104,6 +109,7 @@ void E131Component::leave_(int universe) {
104
109
  if (listen_method_ == E131_MULTICAST) {
105
110
  ip4_addr_t multicast_addr = network::IPAddress(239, 255, ((universe >> 8) & 0xff), ((universe >> 0) & 0xff));
106
111
 
112
+ LwIPLock lock;
107
113
  igmp_leavegroup(IP4_ADDR_ANY4, &multicast_addr);
108
114
  }
109
115
 
@@ -1,4 +1,5 @@
1
1
  #include "esphome/core/helpers.h"
2
+ #include "esphome/core/defines.h"
2
3
 
3
4
  #ifdef USE_ESP32
4
5
 
@@ -30,6 +31,45 @@ void Mutex::unlock() { xSemaphoreGive(this->handle_); }
30
31
  IRAM_ATTR InterruptLock::InterruptLock() { portDISABLE_INTERRUPTS(); }
31
32
  IRAM_ATTR InterruptLock::~InterruptLock() { portENABLE_INTERRUPTS(); }
32
33
 
34
+ #ifdef CONFIG_LWIP_TCPIP_CORE_LOCKING
35
+ #include "lwip/priv/tcpip_priv.h"
36
+ #endif
37
+
38
+ LwIPLock::LwIPLock() {
39
+ #ifdef CONFIG_LWIP_TCPIP_CORE_LOCKING
40
+ // When CONFIG_LWIP_TCPIP_CORE_LOCKING is enabled, lwIP uses a global mutex to protect
41
+ // its internal state. Any thread can take this lock to safely access lwIP APIs.
42
+ //
43
+ // sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER) returns true if the current thread
44
+ // already holds the lwIP core lock. This prevents recursive locking attempts and
45
+ // allows nested LwIPLock instances to work correctly.
46
+ //
47
+ // If we don't already hold the lock, acquire it. This will block until the lock
48
+ // is available if another thread currently holds it.
49
+ if (!sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER)) {
50
+ LOCK_TCPIP_CORE();
51
+ }
52
+ #endif
53
+ }
54
+
55
+ LwIPLock::~LwIPLock() {
56
+ #ifdef CONFIG_LWIP_TCPIP_CORE_LOCKING
57
+ // Only release the lwIP core lock if this thread currently holds it.
58
+ //
59
+ // sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER) queries lwIP's internal lock
60
+ // ownership tracking. It returns true only if the current thread is registered
61
+ // as the lock holder.
62
+ //
63
+ // This check is essential because:
64
+ // 1. We may not have acquired the lock in the constructor (if we already held it)
65
+ // 2. The lock might have been released by other means between constructor and destructor
66
+ // 3. Calling UNLOCK_TCPIP_CORE() without holding the lock causes undefined behavior
67
+ if (sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER)) {
68
+ UNLOCK_TCPIP_CORE();
69
+ }
70
+ #endif
71
+ }
72
+
33
73
  void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
34
74
  #if defined(CONFIG_SOC_IEEE802154_SUPPORTED)
35
75
  // When CONFIG_SOC_IEEE802154_SUPPORTED is defined, esp_efuse_mac_get_default
@@ -22,6 +22,10 @@ void Mutex::unlock() {}
22
22
  IRAM_ATTR InterruptLock::InterruptLock() { state_ = xt_rsil(15); }
23
23
  IRAM_ATTR InterruptLock::~InterruptLock() { xt_wsr_ps(state_); }
24
24
 
25
+ // ESP8266 doesn't support lwIP core locking, so this is a no-op
26
+ LwIPLock::LwIPLock() {}
27
+ LwIPLock::~LwIPLock() {}
28
+
25
29
  void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
26
30
  wifi_get_macaddr(STATION_IF, mac);
27
31
  }
@@ -420,6 +420,7 @@ network::IPAddresses EthernetComponent::get_ip_addresses() {
420
420
  }
421
421
 
422
422
  network::IPAddress EthernetComponent::get_dns_address(uint8_t num) {
423
+ LwIPLock lock;
423
424
  const ip_addr_t *dns_ip = dns_getserver(num);
424
425
  return dns_ip;
425
426
  }
@@ -527,6 +528,7 @@ void EthernetComponent::start_connect_() {
527
528
  ESPHL_ERROR_CHECK(err, "DHCPC set IP info error");
528
529
 
529
530
  if (this->manual_ip_.has_value()) {
531
+ LwIPLock lock;
530
532
  if (this->manual_ip_->dns1.is_set()) {
531
533
  ip_addr_t d;
532
534
  d = this->manual_ip_->dns1;
@@ -559,8 +561,13 @@ bool EthernetComponent::is_connected() { return this->state_ == EthernetComponen
559
561
  void EthernetComponent::dump_connect_params_() {
560
562
  esp_netif_ip_info_t ip;
561
563
  esp_netif_get_ip_info(this->eth_netif_, &ip);
562
- const ip_addr_t *dns_ip1 = dns_getserver(0);
563
- const ip_addr_t *dns_ip2 = dns_getserver(1);
564
+ const ip_addr_t *dns_ip1;
565
+ const ip_addr_t *dns_ip2;
566
+ {
567
+ LwIPLock lock;
568
+ dns_ip1 = dns_getserver(0);
569
+ dns_ip2 = dns_getserver(1);
570
+ }
564
571
 
565
572
  ESP_LOGCONFIG(TAG,
566
573
  " IP Address: %s\n"
@@ -26,6 +26,10 @@ void Mutex::unlock() { xSemaphoreGive(this->handle_); }
26
26
  IRAM_ATTR InterruptLock::InterruptLock() { portDISABLE_INTERRUPTS(); }
27
27
  IRAM_ATTR InterruptLock::~InterruptLock() { portENABLE_INTERRUPTS(); }
28
28
 
29
+ // LibreTiny doesn't support lwIP core locking, so this is a no-op
30
+ LwIPLock::LwIPLock() {}
31
+ LwIPLock::~LwIPLock() {}
32
+
29
33
  void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
30
34
  WiFi.macAddress(mac);
31
35
  }
@@ -264,7 +264,7 @@ class MeterType(WidgetType):
264
264
  color_start,
265
265
  color_end,
266
266
  v[CONF_LOCAL],
267
- size.process(v[CONF_WIDTH]),
267
+ await size.process(v[CONF_WIDTH]),
268
268
  ),
269
269
  )
270
270
  if t == CONF_IMAGE:
@@ -193,13 +193,17 @@ void MQTTClientComponent::start_dnslookup_() {
193
193
  this->dns_resolve_error_ = false;
194
194
  this->dns_resolved_ = false;
195
195
  ip_addr_t addr;
196
+ err_t err;
197
+ {
198
+ LwIPLock lock;
196
199
  #if USE_NETWORK_IPV6
197
- err_t err = dns_gethostbyname_addrtype(this->credentials_.address.c_str(), &addr,
198
- MQTTClientComponent::dns_found_callback, this, LWIP_DNS_ADDRTYPE_IPV6_IPV4);
200
+ err = dns_gethostbyname_addrtype(this->credentials_.address.c_str(), &addr, MQTTClientComponent::dns_found_callback,
201
+ this, LWIP_DNS_ADDRTYPE_IPV6_IPV4);
199
202
  #else
200
- err_t err = dns_gethostbyname_addrtype(this->credentials_.address.c_str(), &addr,
201
- MQTTClientComponent::dns_found_callback, this, LWIP_DNS_ADDRTYPE_IPV4);
203
+ err = dns_gethostbyname_addrtype(this->credentials_.address.c_str(), &addr, MQTTClientComponent::dns_found_callback,
204
+ this, LWIP_DNS_ADDRTYPE_IPV4);
202
205
  #endif /* USE_NETWORK_IPV6 */
206
+ }
203
207
  switch (err) {
204
208
  case ERR_OK: {
205
209
  // Got IP immediately
@@ -44,6 +44,10 @@ void Mutex::unlock() {}
44
44
  IRAM_ATTR InterruptLock::InterruptLock() { state_ = save_and_disable_interrupts(); }
45
45
  IRAM_ATTR InterruptLock::~InterruptLock() { restore_interrupts(state_); }
46
46
 
47
+ // RP2040 doesn't support lwIP core locking, so this is a no-op
48
+ LwIPLock::LwIPLock() {}
49
+ LwIPLock::~LwIPLock() {}
50
+
47
51
  void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
48
52
  #ifdef USE_WIFI
49
53
  WiFi.macAddress(mac);
@@ -74,13 +74,14 @@ def validate_local(config: ConfigType) -> ConfigType:
74
74
  return config
75
75
 
76
76
 
77
- def validate_ota_removed(config: ConfigType) -> ConfigType:
78
- # Only raise error if OTA is explicitly enabled (True)
79
- # If it's False or not specified, we can safely ignore it
80
- if config.get(CONF_OTA):
77
+ def validate_ota(config: ConfigType) -> ConfigType:
78
+ # The OTA option only accepts False to explicitly disable OTA for web_server
79
+ # IMPORTANT: Setting ota: false ONLY affects the web_server component
80
+ # The captive_portal component will still be able to perform OTA updates
81
+ if CONF_OTA in config and config[CONF_OTA] is not False:
81
82
  raise cv.Invalid(
82
- f"The '{CONF_OTA}' option has been removed from 'web_server'. "
83
- f"Please use the new OTA platform structure instead:\n\n"
83
+ f"The '{CONF_OTA}' option in 'web_server' only accepts 'false' to disable OTA. "
84
+ f"To enable OTA, please use the new OTA platform structure instead:\n\n"
84
85
  f"ota:\n"
85
86
  f" - platform: web_server\n\n"
86
87
  f"See https://esphome.io/components/ota for more information."
@@ -185,7 +186,7 @@ CONFIG_SCHEMA = cv.All(
185
186
  web_server_base.WebServerBase
186
187
  ),
187
188
  cv.Optional(CONF_INCLUDE_INTERNAL, default=False): cv.boolean,
188
- cv.Optional(CONF_OTA, default=False): cv.boolean,
189
+ cv.Optional(CONF_OTA): cv.boolean,
189
190
  cv.Optional(CONF_LOG, default=True): cv.boolean,
190
191
  cv.Optional(CONF_LOCAL): cv.boolean,
191
192
  cv.Optional(CONF_SORTING_GROUPS): cv.ensure_list(sorting_group),
@@ -203,7 +204,7 @@ CONFIG_SCHEMA = cv.All(
203
204
  default_url,
204
205
  validate_local,
205
206
  validate_sorting_groups,
206
- validate_ota_removed,
207
+ validate_ota,
207
208
  )
208
209
 
209
210
 
@@ -288,7 +289,11 @@ async def to_code(config):
288
289
  cg.add(var.set_css_url(config[CONF_CSS_URL]))
289
290
  cg.add(var.set_js_url(config[CONF_JS_URL]))
290
291
  # OTA is now handled by the web_server OTA platform
291
- # The CONF_OTA option is kept only for backwards compatibility validation
292
+ # The CONF_OTA option is kept to allow explicitly disabling OTA for web_server
293
+ # IMPORTANT: This ONLY affects the web_server component, NOT captive_portal
294
+ # Captive portal will still be able to perform OTA updates even when this is set
295
+ if config.get(CONF_OTA) is False:
296
+ cg.add_define("USE_WEBSERVER_OTA_DISABLED")
292
297
  cg.add(var.set_expose_log(config[CONF_LOG]))
293
298
  if config[CONF_ENABLE_PRIVATE_NETWORK_ACCESS]:
294
299
  cg.add_define("USE_WEBSERVER_PRIVATE_NETWORK_ACCESS")
@@ -5,6 +5,10 @@
5
5
  #include "esphome/core/application.h"
6
6
  #include "esphome/core/log.h"
7
7
 
8
+ #ifdef USE_CAPTIVE_PORTAL
9
+ #include "esphome/components/captive_portal/captive_portal.h"
10
+ #endif
11
+
8
12
  #ifdef USE_ARDUINO
9
13
  #ifdef USE_ESP8266
10
14
  #include <Updater.h>
@@ -25,7 +29,22 @@ class OTARequestHandler : public AsyncWebHandler {
25
29
  void handleUpload(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len,
26
30
  bool final) override;
27
31
  bool canHandle(AsyncWebServerRequest *request) const override {
28
- return request->url() == "/update" && request->method() == HTTP_POST;
32
+ // Check if this is an OTA update request
33
+ bool is_ota_request = request->url() == "/update" && request->method() == HTTP_POST;
34
+
35
+ #if defined(USE_WEBSERVER_OTA_DISABLED) && defined(USE_CAPTIVE_PORTAL)
36
+ // IMPORTANT: USE_WEBSERVER_OTA_DISABLED only disables OTA for the web_server component
37
+ // Captive portal can still perform OTA updates - check if request is from active captive portal
38
+ // Note: global_captive_portal is the standard way components communicate in ESPHome
39
+ return is_ota_request && captive_portal::global_captive_portal != nullptr &&
40
+ captive_portal::global_captive_portal->is_active();
41
+ #elif defined(USE_WEBSERVER_OTA_DISABLED)
42
+ // OTA disabled for web_server and no captive portal compiled in
43
+ return false;
44
+ #else
45
+ // OTA enabled for web_server
46
+ return is_ota_request;
47
+ #endif
29
48
  }
30
49
 
31
50
  // NOLINTNEXTLINE(readability-identifier-naming)
@@ -152,7 +171,7 @@ void OTARequestHandler::handleUpload(AsyncWebServerRequest *request, const Strin
152
171
 
153
172
  // Finalize
154
173
  if (final) {
155
- ESP_LOGD(TAG, "OTA final chunk: index=%u, len=%u, total_read=%u, contentLength=%u", index, len,
174
+ ESP_LOGD(TAG, "OTA final chunk: index=%zu, len=%zu, total_read=%u, contentLength=%zu", index, len,
156
175
  this->ota_read_length_, request->contentLength());
157
176
 
158
177
  // For Arduino framework, the Update library tracks expected size from firmware header
@@ -268,10 +268,10 @@ std::string WebServer::get_config_json() {
268
268
  return json::build_json([this](JsonObject root) {
269
269
  root["title"] = App.get_friendly_name().empty() ? App.get_name() : App.get_friendly_name();
270
270
  root["comment"] = App.get_comment();
271
- #ifdef USE_WEBSERVER_OTA
272
- root["ota"] = true; // web_server OTA platform is configured
271
+ #if defined(USE_WEBSERVER_OTA_DISABLED) || !defined(USE_WEBSERVER_OTA)
272
+ root["ota"] = false; // Note: USE_WEBSERVER_OTA_DISABLED only affects web_server, not captive_portal
273
273
  #else
274
- root["ota"] = false;
274
+ root["ota"] = true;
275
275
  #endif
276
276
  root["log"] = this->expose_log_;
277
277
  root["lang"] = "en";
@@ -192,7 +192,9 @@ void WebServer::handle_index_request(AsyncWebServerRequest *request) {
192
192
 
193
193
  stream->print(F("</tbody></table><p>See <a href=\"https://esphome.io/web-api/index.html\">ESPHome Web API</a> for "
194
194
  "REST API documentation.</p>"));
195
- #ifdef USE_WEBSERVER_OTA
195
+ #if defined(USE_WEBSERVER_OTA) && !defined(USE_WEBSERVER_OTA_DISABLED)
196
+ // Show OTA form only if web_server OTA is not explicitly disabled
197
+ // Note: USE_WEBSERVER_OTA_DISABLED only affects web_server, not captive_portal
196
198
  stream->print(F("<h2>OTA Update</h2><form method=\"POST\" action=\"/update\" enctype=\"multipart/form-data\"><input "
197
199
  "type=\"file\" name=\"update\"><input type=\"submit\" value=\"Update\"></form>"));
198
200
  #endif
@@ -20,10 +20,6 @@
20
20
  #include "lwip/dns.h"
21
21
  #include "lwip/err.h"
22
22
 
23
- #ifdef CONFIG_LWIP_TCPIP_CORE_LOCKING
24
- #include "lwip/priv/tcpip_priv.h"
25
- #endif
26
-
27
23
  #include "esphome/core/application.h"
28
24
  #include "esphome/core/hal.h"
29
25
  #include "esphome/core/helpers.h"
@@ -295,25 +291,16 @@ bool WiFiComponent::wifi_sta_ip_config_(optional<ManualIP> manual_ip) {
295
291
  }
296
292
 
297
293
  if (!manual_ip.has_value()) {
298
- // sntp_servermode_dhcp lwip/sntp.c (Required to lock TCPIP core functionality!)
299
- // https://github.com/esphome/issues/issues/6591
300
- // https://github.com/espressif/arduino-esp32/issues/10526
301
- #ifdef CONFIG_LWIP_TCPIP_CORE_LOCKING
302
- if (!sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER)) {
303
- LOCK_TCPIP_CORE();
294
+ // sntp_servermode_dhcp lwip/sntp.c (Required to lock TCPIP core functionality!)
295
+ // https://github.com/esphome/issues/issues/6591
296
+ // https://github.com/espressif/arduino-esp32/issues/10526
297
+ {
298
+ LwIPLock lock;
299
+ // lwIP starts the SNTP client if it gets an SNTP server from DHCP. We don't need the time, and more importantly,
300
+ // the built-in SNTP client has a memory leak in certain situations. Disable this feature.
301
+ // https://github.com/esphome/issues/issues/2299
302
+ sntp_servermode_dhcp(false);
304
303
  }
305
- #endif
306
-
307
- // lwIP starts the SNTP client if it gets an SNTP server from DHCP. We don't need the time, and more importantly,
308
- // the built-in SNTP client has a memory leak in certain situations. Disable this feature.
309
- // https://github.com/esphome/issues/issues/2299
310
- sntp_servermode_dhcp(false);
311
-
312
- #ifdef CONFIG_LWIP_TCPIP_CORE_LOCKING
313
- if (sys_thread_tcpip(LWIP_CORE_LOCK_QUERY_HOLDER)) {
314
- UNLOCK_TCPIP_CORE();
315
- }
316
- #endif
317
304
 
318
305
  // No manual IP is set; use DHCP client
319
306
  if (dhcp_status != ESP_NETIF_DHCP_STARTED) {
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.0b5"
7
+ __version__ = "2025.7.1"
8
8
 
9
9
  ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
10
10
  VALID_SUBSTITUTIONS_CHARACTERS = (
esphome/core/helpers.h CHANGED
@@ -683,6 +683,23 @@ class InterruptLock {
683
683
  #endif
684
684
  };
685
685
 
686
+ /** Helper class to lock the lwIP TCPIP core when making lwIP API calls from non-TCPIP threads.
687
+ *
688
+ * This is needed on multi-threaded platforms (ESP32) when CONFIG_LWIP_TCPIP_CORE_LOCKING is enabled.
689
+ * It ensures thread-safe access to lwIP APIs.
690
+ *
691
+ * @note This follows the same pattern as InterruptLock - platform-specific implementations in helpers.cpp
692
+ */
693
+ class LwIPLock {
694
+ public:
695
+ LwIPLock();
696
+ ~LwIPLock();
697
+
698
+ // Delete copy constructor and copy assignment operator to prevent accidental copying
699
+ LwIPLock(const LwIPLock &) = delete;
700
+ LwIPLock &operator=(const LwIPLock &) = delete;
701
+ };
702
+
686
703
  /** Helper class to request `loop()` to be called as fast as possible.
687
704
  *
688
705
  * Usually the ESPHome main loop runs at 60 Hz, sleeping in between invocations of `loop()` if necessary. When a higher
esphome/util.py CHANGED
@@ -147,6 +147,13 @@ class RedirectText:
147
147
  continue
148
148
 
149
149
  self._write_color_replace(line)
150
+ # Check for flash size error and provide helpful guidance
151
+ if (
152
+ "Error: The program size" in line
153
+ and "is greater than maximum allowed" in line
154
+ and (help_msg := get_esp32_arduino_flash_error_help())
155
+ ):
156
+ self._write_color_replace(help_msg)
150
157
  else:
151
158
  self._write_color_replace(s)
152
159
 
@@ -309,3 +316,34 @@ def get_serial_ports() -> list[SerialPort]:
309
316
 
310
317
  result.sort(key=lambda x: x.path)
311
318
  return result
319
+
320
+
321
+ def get_esp32_arduino_flash_error_help() -> str | None:
322
+ """Returns helpful message when ESP32 with Arduino runs out of flash space."""
323
+ from esphome.core import CORE
324
+
325
+ if not (CORE.is_esp32 and CORE.using_arduino):
326
+ return None
327
+
328
+ from esphome.log import AnsiFore, color
329
+
330
+ return (
331
+ "\n"
332
+ + color(
333
+ AnsiFore.YELLOW,
334
+ "💡 TIP: Your ESP32 with Arduino framework has run out of flash space.\n",
335
+ )
336
+ + "\n"
337
+ + "To fix this, switch to the ESP-IDF framework which is more memory efficient:\n"
338
+ + "\n"
339
+ + "1. In your YAML configuration, modify the framework section:\n"
340
+ + "\n"
341
+ + " esp32:\n"
342
+ + " framework:\n"
343
+ + " type: esp-idf\n"
344
+ + "\n"
345
+ + "2. Clean build files and compile again\n"
346
+ + "\n"
347
+ + "Note: ESP-IDF uses less flash space and provides better performance.\n"
348
+ + "Some Arduino-specific libraries may need alternatives.\n\n"
349
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: esphome
3
- Version: 2025.7.0b5
3
+ Version: 2025.7.1
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=ZN5l8FPwSzYuD1F2D6mg8t8hInoTSQzYPVWPyLOnkA0,43369
8
+ esphome/const.py,sha256=PAbR9XARIiUdZrf7bWN_u3L0cvd0QrG18u1mOyiG8Wc,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
@@ -24,7 +24,7 @@ esphome/platformio_api.py,sha256=WxY2L0u_GW5wvSIu6rESf8AaFfB65E1xl_GH6ZyUjH4,120
24
24
  esphome/schema_extractors.py,sha256=DreGUyQlsltzxTEibqw1FDoYa2fOHx3OUhLGALcmnNc,2074
25
25
  esphome/storage_json.py,sha256=iN-i2VwUAd6tH8cPLTATUk_y_uZqzRW35iLTNqSxP6M,10544
26
26
  esphome/types.py,sha256=hnt4C_y0BR9PiWRluaDom1L_afl3lgMma8AMASbJAbM,394
27
- esphome/util.py,sha256=eIXhVyTcsgzUS9AwVmvlDgHDLuKsgFN-mjPO0SL87QQ,9298
27
+ esphome/util.py,sha256=g5r48Q8Wcb33XQ6ipiCYfR2UqPy33oC0bmUBB_Vo-bk,10670
28
28
  esphome/voluptuous_schema.py,sha256=tQUOLvVec6v4pxfWpa8CMgXqBqomuqUUYEJqCJOPhNs,9417
29
29
  esphome/vscode.py,sha256=pKBx_9jmQlRJB1xiqjWq2-pFhXae8VNSFGYoqxRBMkw,4279
30
30
  esphome/wizard.py,sha256=kOA1gdjgt1mCg5Le5ISOgrqo1s_craAHSIWxMZpc03U,15859
@@ -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=_ie-fI8yZ5hJfssBwFcXZz4pLseqTdtJDZ7AQekFLpI,2814
200
+ esphome/components/api/homeassistant_service.h,sha256=rdKnQmwfSEkkbLdBojqQTj0W1OGLblw5MCeP_kA5fm0,3396
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
@@ -754,7 +754,7 @@ esphome/components/e131/e131.cpp,sha256=YhFvOOWbn1YyPjDFTSxc7EwCXlEIw6Om4hZk0l0w
754
754
  esphome/components/e131/e131.h,sha256=Jl31dU4Gm1qLwu8xtnMbfdvwNd7aQFh_n7r8sVuXIPk,1495
755
755
  esphome/components/e131/e131_addressable_light_effect.cpp,sha256=bp1YmqZdLbntbF4YDsVznC6vG_qDHLMLccsu1KOvjpY,3094
756
756
  esphome/components/e131/e131_addressable_light_effect.h,sha256=8bP6LD_WaT5Sww09FLFbUBSj1Uq5kPijjtrACZaNG9w,1232
757
- esphome/components/e131/e131_packet.cpp,sha256=uWwW6GchI8SvDQ6ZvzT7QoFZgErOnxu4ZoVShyJ6Kso,3751
757
+ esphome/components/e131/e131_packet.cpp,sha256=WF-cEPLwKNwH0eowaY-O65HCZxW7AoxAQ8IqBvUGMgM,3849
758
758
  esphome/components/ee895/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
759
759
  esphome/components/ee895/ee895.cpp,sha256=10PzDjVUXP0QanhtewV-0_k8t2ZV4PyH6fnylAQn3_o,3549
760
760
  esphome/components/ee895/ee895.h,sha256=PlW9Q8XFN6_V0SJxD3k-upafHEXvSLbvRb5JINp52RQ,1135
@@ -843,7 +843,7 @@ esphome/components/esp32/gpio_esp32_h2.py,sha256=1upnLmb8rTZFX0MaIApF9C_-OpQJ6Cg
843
843
  esphome/components/esp32/gpio_esp32_p4.py,sha256=yquY1Ck1o5EN2Gc2MQVqRE1-lyscn4fSxCT46BWHQBI,1329
844
844
  esphome/components/esp32/gpio_esp32_s2.py,sha256=QocrOirlaLAWrtzv9q4eE4jVOAf7u_gOxdTasTJ5zp8,2037
845
845
  esphome/components/esp32/gpio_esp32_s3.py,sha256=4LYI1EgQKe0HCWbVvEi5ltSdaoEUJoU260VSN0EHSc0,1753
846
- esphome/components/esp32/helpers.cpp,sha256=neIGHSu2K4WOVIpoicNdOPXvogbolhUHTzVjVhXetek,2151
846
+ esphome/components/esp32/helpers.cpp,sha256=j0V0-kI4Ww04BH5N5EfyRgQHks0q_OoH8mPJjSJRo9I,3694
847
847
  esphome/components/esp32/post_build.py.script,sha256=ZBsPNunx2BH4ZiRyXnjTP7D7eN289eGAK8I73zXyq5o,2239
848
848
  esphome/components/esp32/preferences.cpp,sha256=WpEG6PenHwrAIonuoV_chdDJriJXF5dcpIbuYfmaUCQ,6229
849
849
  esphome/components/esp32/preferences.h,sha256=9HIy-BOgjOXJiEgOizZ_Qb8-l6K4eb3VSPW8Y8ffuWM,165
@@ -925,7 +925,7 @@ esphome/components/esp8266/core.h,sha256=Gt8v8q9LxxHbKjf445vOk1iYXnRYCl4VogI7sdU
925
925
  esphome/components/esp8266/gpio.cpp,sha256=3T7h3PXtfdsRu-swTkyoZ3lxvNgmsJ_iUgo60zZY94E,5174
926
926
  esphome/components/esp8266/gpio.h,sha256=drRteE3plCa62g9xm25cXu1CngCh-SQh2eNduCRuJCs,1060
927
927
  esphome/components/esp8266/gpio.py,sha256=A2vOhpFK2674x2OJ8Ruy_c-Xfe2CWPVy2N3c4OBGYk4,6368
928
- esphome/components/esp8266/helpers.cpp,sha256=TJwyjQe2tKwYu1hiFbI3NGFe5vRV7Mkv8SCIJ2iJ7Wg,848
928
+ esphome/components/esp8266/helpers.cpp,sha256=U6xwUUXcUxMrgBwLqOR9YUzEiq8pSig-3lfMT_2pNHs,963
929
929
  esphome/components/esp8266/post_build.py.script,sha256=Hca2nrttn2jdYmFVnNxsgMNlEFk2pg8GKMB6CTppR_k,703
930
930
  esphome/components/esp8266/preferences.cpp,sha256=yQftUwxygorTst_x52P34JdgcNG8ycdSPmkt0ll8IEA,8230
931
931
  esphome/components/esp8266/preferences.h,sha256=9sx-Q5795dHCi6a3d_oE21INcrztnWw9CT0iqa1WZYE,220
@@ -941,7 +941,7 @@ esphome/components/esphome/ota/ota_esphome.cpp,sha256=nj1hd4fkGvKq95NYqhE9faG0pY
941
941
  esphome/components/esphome/ota/ota_esphome.h,sha256=MHd6DPavp08gfb-bcttjCiv3U60XMSTMDi2nPcN8Y7s,1140
942
942
  esphome/components/ethernet/__init__.py,sha256=xz_igz3-VfGgqLWQysq4WhsfxV38EUPmG9A5xKzCmhs,12444
943
943
  esphome/components/ethernet/esp_eth_phy_jl1101.c,sha256=WTNJ2eS0bxTqYu8Q4sk98ZyAO4A0xU8A2NXKTo37oLk,12156
944
- esphome/components/ethernet/ethernet_component.cpp,sha256=L9WpzkPpqUktDm_sUsP6n68gmWlKiusIFKuDw1bVDI0,25363
944
+ esphome/components/ethernet/ethernet_component.cpp,sha256=Dfa_8TBtFoTHEldo53wiBW-ianUbRLvfFwfhb4COSxc,25452
945
945
  esphome/components/ethernet/ethernet_component.h,sha256=7Z58ZRxFMQ0NyLG8Y2R6ORCZNz7ioDCZxwgj6nXSpwA,4635
946
946
  esphome/components/ethernet_info/__init__.py,sha256=LoiZr_nRyJfR5w1ZWOFppOVTQRwlgmHU-boDala2fLA,33
947
947
  esphome/components/ethernet_info/ethernet_info_text_sensor.cpp,sha256=nfP7xeusvbzee1KHfuipELWvF1vmuk_2e4G_NlLeJ3M,564
@@ -1491,7 +1491,7 @@ esphome/components/libretiny/generate_components.py,sha256=kMj0goBdSijQNUrPQ6dNZ
1491
1491
  esphome/components/libretiny/gpio.py,sha256=xewTZ6ooaruY1ilnIxINgdNHpMg8iTdF1Gru1r68IRI,6393
1492
1492
  esphome/components/libretiny/gpio_arduino.cpp,sha256=7glFm8izBCFlxERstTvnKTqNax4I0Nmas7WVWFvgD1Y,2972
1493
1493
  esphome/components/libretiny/gpio_arduino.h,sha256=ZfU3FCDkgIWWKVWnuXwQZA2sbvJE9cct8BcRHe8b3pI,1054
1494
- esphome/components/libretiny/helpers.cpp,sha256=q7826WQMmJACvuRULv_7ahWzW2tKH-kB3O_FTQodWxw,974
1494
+ esphome/components/libretiny/helpers.cpp,sha256=Vt74p0CF_mRD-ZefyoD3aIGx82md5FDou0h6leXfw1s,1091
1495
1495
  esphome/components/libretiny/lt_component.cpp,sha256=ep3avHdRzi8mVe5VxuaEi11IPddTNfoyqcYiSZS9w1U,679
1496
1496
  esphome/components/libretiny/lt_component.h,sha256=9R1wDscC53rlxF1kmnxyzSJ0kG-6W_QzSxqJ0RAdKBk,756
1497
1497
  esphome/components/libretiny/preferences.cpp,sha256=K8ASTUzqZLBPZk2Iburm5WUJ6CzgE-X5dQluZruOOMI,5456
@@ -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=ptMHG6LCky1jwtUcGODek0W94Ju9PWGPbkg91l3NyKA,11520
1631
+ esphome/components/lvgl/widgets/meter.py,sha256=yPC9kFVGjOdJqjBlCVKxDrVEjyfLUXlEUjuy3UhcCh0,11526
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
@@ -1957,7 +1957,7 @@ esphome/components/mqtt/mqtt_binary_sensor.cpp,sha256=wd5mAnBieyl8zNGoDwWbVFuaKZ
1957
1957
  esphome/components/mqtt/mqtt_binary_sensor.h,sha256=QwGVAYkOcEVkvNjtBu6JHJYXXwc-0AOTNIBS1otLzig,958
1958
1958
  esphome/components/mqtt/mqtt_button.cpp,sha256=REi-AtjplNU6eoAQClgS78-V6JUN3hx_p_UUDy4UvlQ,1509
1959
1959
  esphome/components/mqtt/mqtt_button.h,sha256=GJ6D6ANZgy3azdLjnHDhSrjuxEOSigYSjWs2J-akOPw,906
1960
- esphome/components/mqtt/mqtt_client.cpp,sha256=HRj5jMYuUGO2yxLjTkadnZInM5kNZE5zutoCJmtYWGk,26321
1960
+ esphome/components/mqtt/mqtt_client.cpp,sha256=vf0UF0UvBIkR1s-RYk0_pIqnTVr2VVOKT42WfphPVZ0,26345
1961
1961
  esphome/components/mqtt/mqtt_client.h,sha256=MLFPh-shnPx_3-76019kGxS97VhYRkrE6QtkRk8X2kU,16299
1962
1962
  esphome/components/mqtt/mqtt_climate.cpp,sha256=L62VSe9KWn8ELhfuNn4i8Hh841VdgL4hQsuH55ovwkk,16850
1963
1963
  esphome/components/mqtt/mqtt_climate.h,sha256=20FAWmZ-zk2RFakvRSyiZEHemo8kBKxPi3xDmJfzXLw,1805
@@ -2519,7 +2519,7 @@ esphome/components/rp2040/core.h,sha256=YA4WtdKTdnZxkpOUF4GwT3KMjsbFjH6j0y42Evet
2519
2519
  esphome/components/rp2040/gpio.cpp,sha256=8aewN0-fqru1W7zj_g6hnhh9gjMKOIMamGIzSZkbozU,3516
2520
2520
  esphome/components/rp2040/gpio.h,sha256=xIaLyJ0GLs2uNVxnYXweixWDW0nZ5bHmGCdCWQI55tA,1055
2521
2521
  esphome/components/rp2040/gpio.py,sha256=HTZYi8manLRjLcEOwwSd7tTTEKa7btRco-gYQYudN7I,2913
2522
- esphome/components/rp2040/helpers.cpp,sha256=_5EEiPRA4-VnU9Trok7sihILsGwLCwAJc5tRTOGlRog,1223
2522
+ esphome/components/rp2040/helpers.cpp,sha256=_aP4lVleiFzedUAAyJkEmddWld6B8zC0s7YIsCfWKjI,1337
2523
2523
  esphome/components/rp2040/post_build.py.script,sha256=JgNm6aGGA9LYGZEjzqr8EHiugKLU6h7fmmXFAhdBleI,699
2524
2524
  esphome/components/rp2040/preferences.cpp,sha256=nbQA47idH1JlXfTElIrtWtRwmJ656sWBf5Lwh37r2NI,4418
2525
2525
  esphome/components/rp2040/preferences.h,sha256=z7zFhLXLLmURu5RNaAlOpPIv2TnK8cvrGkGAyz0LvjM,216
@@ -3387,16 +3387,16 @@ esphome/components/waveshare_epaper/display.py,sha256=213uq6fWqi9GprtzoNOf7DoRvb
3387
3387
  esphome/components/waveshare_epaper/waveshare_213v3.cpp,sha256=JgjLO94Q1InPblrcaPcGclCr01gynq8hYvbbYZD7OjY,7462
3388
3388
  esphome/components/waveshare_epaper/waveshare_epaper.cpp,sha256=fd6IvkLKlOtHujw_AWu03Y2E0E3IE9Iq_7v9FoukWkY,145214
3389
3389
  esphome/components/waveshare_epaper/waveshare_epaper.h,sha256=6INmEzibRGNKURBnmDt2svqTxNyZxHO3c1cmEte_ej8,24246
3390
- esphome/components/web_server/__init__.py,sha256=J0kfn2xVcdgKjtt5wHun3EOK1zpYgnuJwxewZpoHJ60,11087
3390
+ esphome/components/web_server/__init__.py,sha256=1tyHHcqqQnuXesu5sZwh8ahA_Ns1cUKj-24qXufH4pk,11491
3391
3391
  esphome/components/web_server/list_entities.cpp,sha256=yQ3skDSDFnnKsEpLdkyjzySmXOtrxzQ4sk8UW_K1Y-U,5972
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=kQ_ItIqWFnjaviidmfZ3EKO3_vvntjK78gjK5Za4wp8,73515
3395
+ esphome/components/web_server/web_server.cpp,sha256=Yo8PAJS0U4tmE9iQ5a4hZG8g3j4Ip6CF6qeyJ81WTrE,73600
3396
3396
  esphome/components/web_server/web_server.h,sha256=AGCOdOaZe7Xe5nCL4rHhqWNg-uo5cc6nu84vQr4GdrQ,21558
3397
- esphome/components/web_server/web_server_v1.cpp,sha256=fV-xD15gjGVd2g_u4aUF2RDJHANuvbn6qtokNUCTG7Y,7212
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
3399
- esphome/components/web_server/ota/ota_web_server.cpp,sha256=kWTD9frcekWvhqau2T12yFUAku9r0CR2uDmmLUfvDxw,7279
3399
+ esphome/components/web_server/ota/ota_web_server.cpp,sha256=4c1BeJDlwT1YJCbnt4fYRzAVtJxDP3hvJkbYfetZX4E,8140
3400
3400
  esphome/components/web_server/ota/ota_web_server.h,sha256=ZZQHTxb21gqukibGei-om00MxpBD4Qyy031PXBMmjT8,604
3401
3401
  esphome/components/web_server_base/__init__.py,sha256=uM9rrhE1Pu_yvwfrLLHheh1ip_9mL2JSZC5NrrBdrj0,1281
3402
3402
  esphome/components/web_server_base/web_server_base.cpp,sha256=plEcGgYKFku3cSlv7rNAPC6GMWkjIflie3yVERoHDNA,876
@@ -3432,7 +3432,7 @@ esphome/components/wiegand/wiegand.h,sha256=gyg5szEK0okoeLBQR284k84xy-ln19kNIkeO
3432
3432
  esphome/components/wifi/__init__.py,sha256=PdteGKfa8FYdpGED8Gu9IXL2UzNmQX87jYDFTxHuCx8,18884
3433
3433
  esphome/components/wifi/wifi_component.cpp,sha256=qNfhYkXrEXRuRGEziFrkTngs4xpf20WOOJfbFLZxwuU,28904
3434
3434
  esphome/components/wifi/wifi_component.h,sha256=Lln0mi1o4inJUtn36DzBPhXAveh2P44bdf2vi97VNdc,15782
3435
- esphome/components/wifi/wifi_component_esp32_arduino.cpp,sha256=WML_usn-M6w5KIgoaj-yktTjH9HwsPZksMA7XFml00c,28017
3435
+ esphome/components/wifi/wifi_component_esp32_arduino.cpp,sha256=zsFcljPzCUiS-jw6Y0yjUEQFgO7O5HXkvrgY64nTGfs,27719
3436
3436
  esphome/components/wifi/wifi_component_esp8266.cpp,sha256=jnj9xvGct40-0MfbJlK3eJATbuPHold5QqbPisQQDdY,27514
3437
3437
  esphome/components/wifi/wifi_component_esp_idf.cpp,sha256=jMdD2INzgdSnff7-jnxBeG5xQQCOGk4y6UXPZ4sFOQE,35864
3438
3438
  esphome/components/wifi/wifi_component_libretiny.cpp,sha256=zjJ9XNGIsW0Q8fczMxYr4hQSX559wD-usw1NKRIKaJw,16144
@@ -3618,7 +3618,7 @@ esphome/core/event_pool.h,sha256=TjA2sl_s5ScKC9d_5nssvImbPkpJJUWo5DDZwCaZ0QU,245
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
- esphome/core/helpers.h,sha256=jhoCkhTlwqSVOXVNWK7RnIXgJQiu9QvbsZV-WmPWOTY,33362
3621
+ esphome/core/helpers.h,sha256=213N4rXgWCcuBB-aZDV9TW5UIYRzzGhU44YXWJz2Ys4,33961
3622
3622
  esphome/core/lock_free_queue.h,sha256=S6QMMT8L8rG_qOzkTHWqcP9amok99hFhXGlZoj8C4XU,5104
3623
3623
  esphome/core/log.cpp,sha256=cc6JIMRlIEk7lCQa6JFrL6bTBZ89xWNLwf26AFNzKC0,1625
3624
3624
  esphome/core/log.h,sha256=Fb0_ORK0q-WV0i49gzb8i9_C38RUe8VILIdbu1Bel5M,6627
@@ -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.0b5.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3659
- esphome-2025.7.0b5.dist-info/METADATA,sha256=Hm8UwtfOHLC_vphdoULkU0CFP34c2qrxWMuIbubMGTs,3707
3660
- esphome-2025.7.0b5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
3661
- esphome-2025.7.0b5.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3662
- esphome-2025.7.0b5.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3663
- esphome-2025.7.0b5.dist-info/RECORD,,
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,,