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.
- esphome/components/api/homeassistant_service.h +10 -1
- esphome/components/e131/e131_packet.cpp +7 -1
- esphome/components/esp32/helpers.cpp +40 -0
- esphome/components/esp8266/helpers.cpp +4 -0
- esphome/components/ethernet/ethernet_component.cpp +9 -2
- esphome/components/libretiny/helpers.cpp +4 -0
- esphome/components/lvgl/widgets/meter.py +1 -1
- esphome/components/mqtt/mqtt_client.cpp +8 -4
- esphome/components/rp2040/helpers.cpp +4 -0
- esphome/components/web_server/__init__.py +14 -9
- esphome/components/web_server/ota/ota_web_server.cpp +21 -2
- esphome/components/web_server/web_server.cpp +3 -3
- esphome/components/web_server/web_server_v1.cpp +3 -1
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +9 -22
- esphome/const.py +1 -1
- esphome/core/helpers.h +17 -0
- esphome/util.py +38 -0
- {esphome-2025.7.0b5.dist-info → esphome-2025.7.1.dist-info}/METADATA +1 -1
- {esphome-2025.7.0b5.dist-info → esphome-2025.7.1.dist-info}/RECORD +23 -23
- {esphome-2025.7.0b5.dist-info → esphome-2025.7.1.dist-info}/WHEEL +0 -0
- {esphome-2025.7.0b5.dist-info → esphome-2025.7.1.dist-info}/entry_points.txt +0 -0
- {esphome-2025.7.0b5.dist-info → esphome-2025.7.1.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.7.0b5.dist-info → esphome-2025.7.1.dist-info}/top_level.txt +0 -0
|
@@ -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
|
|
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
|
-
|
|
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
|
|
563
|
-
const ip_addr_t *dns_ip2
|
|
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
|
}
|
|
@@ -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
|
-
|
|
198
|
-
|
|
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
|
-
|
|
201
|
-
|
|
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
|
|
78
|
-
#
|
|
79
|
-
#
|
|
80
|
-
|
|
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
|
|
83
|
-
f"
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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=%
|
|
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
|
-
#
|
|
272
|
-
root["ota"] =
|
|
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"] =
|
|
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
|
-
#
|
|
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
|
-
|
|
302
|
-
|
|
303
|
-
|
|
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
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
3659
|
-
esphome-2025.7.
|
|
3660
|
-
esphome-2025.7.
|
|
3661
|
-
esphome-2025.7.
|
|
3662
|
-
esphome-2025.7.
|
|
3663
|
-
esphome-2025.7.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|