esphome 2025.9.0b4__py3-none-any.whl → 2025.9.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.
esphome/__main__.py CHANGED
@@ -212,7 +212,7 @@ def has_mqtt_logging() -> bool:
212
212
  if CONF_TOPIC not in log_topic:
213
213
  return False
214
214
 
215
- return log_topic[CONF_LEVEL] != "NONE"
215
+ return log_topic.get(CONF_LEVEL, None) != "NONE"
216
216
 
217
217
 
218
218
  def has_mqtt() -> bool:
@@ -10,7 +10,8 @@ from esphome.const import (
10
10
  PLATFORM_LN882X,
11
11
  PLATFORM_RTL87XX,
12
12
  )
13
- from esphome.core import CORE, CoroPriority, coroutine_with_priority
13
+ from esphome.core import CORE, coroutine_with_priority
14
+ from esphome.coroutine import CoroPriority
14
15
 
15
16
  AUTO_LOAD = ["web_server_base", "ota.web_server"]
16
17
  DEPENDENCIES = ["wifi"]
@@ -40,7 +41,7 @@ CONFIG_SCHEMA = cv.All(
40
41
  )
41
42
 
42
43
 
43
- @coroutine_with_priority(CoroPriority.COMMUNICATION)
44
+ @coroutine_with_priority(CoroPriority.CAPTIVE_PORTAL)
44
45
  async def to_code(config):
45
46
  paren = await cg.get_variable(config[CONF_WEB_SERVER_BASE_ID])
46
47
 
@@ -15,6 +15,8 @@ using namespace bytebuffer;
15
15
 
16
16
  static const char *const TAG = "esp32_improv.component";
17
17
  static const char *const ESPHOME_MY_LINK = "https://my.home-assistant.io/redirect/config_flow_start?domain=esphome";
18
+ static constexpr uint16_t STOP_ADVERTISING_DELAY =
19
+ 10000; // Delay (ms) before stopping service to allow BLE clients to read the final state
18
20
 
19
21
  ESP32ImprovComponent::ESP32ImprovComponent() { global_improv_component = this; }
20
22
 
@@ -31,6 +33,9 @@ void ESP32ImprovComponent::setup() {
31
33
  #endif
32
34
  global_ble_server->on(BLEServerEvt::EmptyEvt::ON_DISCONNECT,
33
35
  [this](uint16_t conn_id) { this->set_error_(improv::ERROR_NONE); });
36
+
37
+ // Start with loop disabled - will be enabled by start() when needed
38
+ this->disable_loop();
34
39
  }
35
40
 
36
41
  void ESP32ImprovComponent::setup_characteristics() {
@@ -190,6 +195,25 @@ void ESP32ImprovComponent::set_status_indicator_state_(bool state) {
190
195
  #endif
191
196
  }
192
197
 
198
+ #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_DEBUG
199
+ const char *ESP32ImprovComponent::state_to_string_(improv::State state) {
200
+ switch (state) {
201
+ case improv::STATE_STOPPED:
202
+ return "STOPPED";
203
+ case improv::STATE_AWAITING_AUTHORIZATION:
204
+ return "AWAITING_AUTHORIZATION";
205
+ case improv::STATE_AUTHORIZED:
206
+ return "AUTHORIZED";
207
+ case improv::STATE_PROVISIONING:
208
+ return "PROVISIONING";
209
+ case improv::STATE_PROVISIONED:
210
+ return "PROVISIONED";
211
+ default:
212
+ return "UNKNOWN";
213
+ }
214
+ }
215
+ #endif
216
+
193
217
  bool ESP32ImprovComponent::check_identify_() {
194
218
  uint32_t now = millis();
195
219
 
@@ -203,31 +227,42 @@ bool ESP32ImprovComponent::check_identify_() {
203
227
  }
204
228
 
205
229
  void ESP32ImprovComponent::set_state_(improv::State state) {
206
- ESP_LOGV(TAG, "Setting state: %d", state);
230
+ #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_DEBUG
231
+ if (this->state_ != state) {
232
+ ESP_LOGD(TAG, "State transition: %s (0x%02X) -> %s (0x%02X)", this->state_to_string_(this->state_), this->state_,
233
+ this->state_to_string_(state), state);
234
+ }
235
+ #endif
207
236
  this->state_ = state;
208
- if (this->status_->get_value().empty() || this->status_->get_value()[0] != state) {
237
+ if (this->status_ != nullptr && (this->status_->get_value().empty() || this->status_->get_value()[0] != state)) {
209
238
  this->status_->set_value(ByteBuffer::wrap(static_cast<uint8_t>(state)));
210
239
  if (state != improv::STATE_STOPPED)
211
240
  this->status_->notify();
212
241
  }
213
- std::vector<uint8_t> service_data(8, 0);
214
- service_data[0] = 0x77; // PR
215
- service_data[1] = 0x46; // IM
216
- service_data[2] = static_cast<uint8_t>(state);
217
-
218
- uint8_t capabilities = 0x00;
242
+ // Only advertise valid Improv states (0x01-0x04).
243
+ // STATE_STOPPED (0x00) is internal only and not part of the Improv spec.
244
+ // Advertising 0x00 causes undefined behavior in some clients and makes them
245
+ // repeatedly connect trying to determine the actual state.
246
+ if (state != improv::STATE_STOPPED) {
247
+ std::vector<uint8_t> service_data(8, 0);
248
+ service_data[0] = 0x77; // PR
249
+ service_data[1] = 0x46; // IM
250
+ service_data[2] = static_cast<uint8_t>(state);
251
+
252
+ uint8_t capabilities = 0x00;
219
253
  #ifdef USE_OUTPUT
220
- if (this->status_indicator_ != nullptr)
221
- capabilities |= improv::CAPABILITY_IDENTIFY;
254
+ if (this->status_indicator_ != nullptr)
255
+ capabilities |= improv::CAPABILITY_IDENTIFY;
222
256
  #endif
223
257
 
224
- service_data[3] = capabilities;
225
- service_data[4] = 0x00; // Reserved
226
- service_data[5] = 0x00; // Reserved
227
- service_data[6] = 0x00; // Reserved
228
- service_data[7] = 0x00; // Reserved
258
+ service_data[3] = capabilities;
259
+ service_data[4] = 0x00; // Reserved
260
+ service_data[5] = 0x00; // Reserved
261
+ service_data[6] = 0x00; // Reserved
262
+ service_data[7] = 0x00; // Reserved
229
263
 
230
- esp32_ble::global_ble->advertising_set_service_data(service_data);
264
+ esp32_ble::global_ble->advertising_set_service_data(service_data);
265
+ }
231
266
  #ifdef USE_ESP32_IMPROV_STATE_CALLBACK
232
267
  this->state_callback_.call(this->state_, this->error_state_);
233
268
  #endif
@@ -237,7 +272,12 @@ void ESP32ImprovComponent::set_error_(improv::Error error) {
237
272
  if (error != improv::ERROR_NONE) {
238
273
  ESP_LOGE(TAG, "Error: %d", error);
239
274
  }
240
- if (this->error_->get_value().empty() || this->error_->get_value()[0] != error) {
275
+ // The error_ characteristic is initialized in setup_characteristics() which is called
276
+ // from the loop, while the BLE disconnect callback is registered in setup().
277
+ // error_ can be nullptr if:
278
+ // 1. A client connects/disconnects before setup_characteristics() is called
279
+ // 2. The device is already provisioned so the service never starts (should_start_ is false)
280
+ if (this->error_ != nullptr && (this->error_->get_value().empty() || this->error_->get_value()[0] != error)) {
241
281
  this->error_->set_value(ByteBuffer::wrap(static_cast<uint8_t>(error)));
242
282
  if (this->state_ != improv::STATE_STOPPED)
243
283
  this->error_->notify();
@@ -261,7 +301,10 @@ void ESP32ImprovComponent::start() {
261
301
 
262
302
  void ESP32ImprovComponent::stop() {
263
303
  this->should_start_ = false;
264
- this->set_timeout("end-service", 1000, [this] {
304
+ // Wait before stopping the service to ensure all BLE clients see the state change.
305
+ // This prevents clients from repeatedly reconnecting and wasting resources by allowing
306
+ // them to observe that the device is provisioned before the service disappears.
307
+ this->set_timeout("end-service", STOP_ADVERTISING_DELAY, [this] {
265
308
  if (this->state_ == improv::STATE_STOPPED || this->service_ == nullptr)
266
309
  return;
267
310
  this->service_->stop();
@@ -79,12 +79,12 @@ class ESP32ImprovComponent : public Component {
79
79
  std::vector<uint8_t> incoming_data_;
80
80
  wifi::WiFiAP connecting_sta_;
81
81
 
82
- BLEService *service_ = nullptr;
83
- BLECharacteristic *status_;
84
- BLECharacteristic *error_;
85
- BLECharacteristic *rpc_;
86
- BLECharacteristic *rpc_response_;
87
- BLECharacteristic *capabilities_;
82
+ BLEService *service_{nullptr};
83
+ BLECharacteristic *status_{nullptr};
84
+ BLECharacteristic *error_{nullptr};
85
+ BLECharacteristic *rpc_{nullptr};
86
+ BLECharacteristic *rpc_response_{nullptr};
87
+ BLECharacteristic *capabilities_{nullptr};
88
88
 
89
89
  #ifdef USE_BINARY_SENSOR
90
90
  binary_sensor::BinarySensor *authorizer_{nullptr};
@@ -108,6 +108,9 @@ class ESP32ImprovComponent : public Component {
108
108
  void process_incoming_data_();
109
109
  void on_wifi_connect_timeout_();
110
110
  bool check_identify_();
111
+ #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_DEBUG
112
+ const char *state_to_string_(improv::State state);
113
+ #endif
111
114
  };
112
115
 
113
116
  // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
@@ -16,7 +16,8 @@ from esphome.const import (
16
16
  CONF_SAFE_MODE,
17
17
  CONF_VERSION,
18
18
  )
19
- from esphome.core import CoroPriority, coroutine_with_priority
19
+ from esphome.core import coroutine_with_priority
20
+ from esphome.coroutine import CoroPriority
20
21
  import esphome.final_validate as fv
21
22
 
22
23
  _LOGGER = logging.getLogger(__name__)
@@ -121,7 +122,7 @@ CONFIG_SCHEMA = (
121
122
  FINAL_VALIDATE_SCHEMA = ota_esphome_final_validate
122
123
 
123
124
 
124
- @coroutine_with_priority(CoroPriority.COMMUNICATION)
125
+ @coroutine_with_priority(CoroPriority.OTA_UPDATES)
125
126
  async def to_code(config):
126
127
  var = cg.new_Pvariable(config[CONF_ID])
127
128
  cg.add(var.set_port(config[CONF_PORT]))
@@ -6,6 +6,7 @@ namespace gpio {
6
6
 
7
7
  static const char *const TAG = "gpio.binary_sensor";
8
8
 
9
+ #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_DEBUG
9
10
  static const LogString *interrupt_type_to_string(gpio::InterruptType type) {
10
11
  switch (type) {
11
12
  case gpio::INTERRUPT_RISING_EDGE:
@@ -22,6 +23,7 @@ static const LogString *interrupt_type_to_string(gpio::InterruptType type) {
22
23
  static const LogString *gpio_mode_to_string(bool use_interrupt) {
23
24
  return use_interrupt ? LOG_STR("interrupt") : LOG_STR("polling");
24
25
  }
26
+ #endif
25
27
 
26
28
  void IRAM_ATTR GPIOBinarySensorStore::gpio_intr(GPIOBinarySensorStore *arg) {
27
29
  bool new_state = arg->isr_pin_.digital_read();
@@ -128,4 +128,4 @@ async def to_code(config):
128
128
 
129
129
  cg.add_library("tonia/HeatpumpIR", "1.0.37")
130
130
  if CORE.is_libretiny or CORE.is_esp32:
131
- CORE.add_platformio_option("lib_ignore", "IRremoteESP8266")
131
+ CORE.add_platformio_option("lib_ignore", ["IRremoteESP8266"])
@@ -3,7 +3,8 @@ import esphome.codegen as cg
3
3
  from esphome.components.ota import BASE_OTA_SCHEMA, OTAComponent, ota_to_code
4
4
  import esphome.config_validation as cv
5
5
  from esphome.const import CONF_ID, CONF_PASSWORD, CONF_URL, CONF_USERNAME
6
- from esphome.core import CoroPriority, coroutine_with_priority
6
+ from esphome.core import coroutine_with_priority
7
+ from esphome.coroutine import CoroPriority
7
8
 
8
9
  from .. import CONF_HTTP_REQUEST_ID, HttpRequestComponent, http_request_ns
9
10
 
@@ -40,7 +41,7 @@ CONFIG_SCHEMA = cv.All(
40
41
  )
41
42
 
42
43
 
43
- @coroutine_with_priority(CoroPriority.COMMUNICATION)
44
+ @coroutine_with_priority(CoroPriority.OTA_UPDATES)
44
45
  async def to_code(config):
45
46
  var = cg.new_Pvariable(config[CONF_ID])
46
47
  await ota_to_code(var, config)
@@ -11,7 +11,8 @@ from esphome.const import (
11
11
  CONF_SERVICES,
12
12
  PlatformFramework,
13
13
  )
14
- from esphome.core import CORE, CoroPriority, coroutine_with_priority
14
+ from esphome.core import CORE, coroutine_with_priority
15
+ from esphome.coroutine import CoroPriority
15
16
 
16
17
  CODEOWNERS = ["@esphome/core"]
17
18
  DEPENDENCIES = ["network"]
@@ -72,7 +73,7 @@ def mdns_service(
72
73
  )
73
74
 
74
75
 
75
- @coroutine_with_priority(CoroPriority.COMMUNICATION)
76
+ @coroutine_with_priority(CoroPriority.NETWORK_SERVICES)
76
77
  async def to_code(config):
77
78
  if config[CONF_DISABLED] is True:
78
79
  return
@@ -401,6 +401,12 @@ class DriverChip:
401
401
  sequence.append((MADCTL, madctl))
402
402
  return madctl
403
403
 
404
+ def skip_command(self, command: str):
405
+ """
406
+ Allow suppressing a standard command in the init sequence.
407
+ """
408
+ return self.get_default(f"no_{command.lower()}", False)
409
+
404
410
  def get_sequence(self, config) -> tuple[tuple[int, ...], int]:
405
411
  """
406
412
  Create the init sequence for the display.
@@ -432,7 +438,9 @@ class DriverChip:
432
438
  sequence.append((INVOFF,))
433
439
  if brightness := config.get(CONF_BRIGHTNESS, self.get_default(CONF_BRIGHTNESS)):
434
440
  sequence.append((BRIGHTNESS, brightness))
435
- sequence.append((SLPOUT,))
441
+ # Add a SLPOUT command if required.
442
+ if not self.skip_command("SLPOUT"):
443
+ sequence.append((SLPOUT,))
436
444
  sequence.append((DISPON,))
437
445
 
438
446
  # Flatten the sequence into a list of bytes, with the length of each command
@@ -7,6 +7,7 @@ wave_4_3 = DriverChip(
7
7
  "ESP32-S3-TOUCH-LCD-4.3",
8
8
  swap_xy=UNDEFINED,
9
9
  initsequence=(),
10
+ color_order="RGB",
10
11
  width=800,
11
12
  height=480,
12
13
  pclk_frequency="16MHz",
@@ -27,7 +27,8 @@ DriverChip(
27
27
  bus_mode=TYPE_QUAD,
28
28
  brightness=0xD0,
29
29
  color_order=MODE_RGB,
30
- initsequence=(SLPOUT,), # Requires early SLPOUT
30
+ no_slpout=True, # SLPOUT is in the init sequence, early
31
+ initsequence=(SLPOUT,),
31
32
  )
32
33
 
33
34
  DriverChip(
@@ -95,6 +96,7 @@ CO5300 = DriverChip(
95
96
  brightness=0xD0,
96
97
  color_order=MODE_RGB,
97
98
  bus_mode=TYPE_QUAD,
99
+ no_slpout=True,
98
100
  initsequence=(
99
101
  (SLPOUT,), # Requires early SLPOUT
100
102
  (PAGESEL, 0x00),
@@ -10,7 +10,8 @@ from esphome.const import (
10
10
  CONF_TRIGGER_ID,
11
11
  PlatformFramework,
12
12
  )
13
- from esphome.core import CORE, CoroPriority, coroutine_with_priority
13
+ from esphome.core import CORE, coroutine_with_priority
14
+ from esphome.coroutine import CoroPriority
14
15
 
15
16
  CODEOWNERS = ["@esphome/core"]
16
17
  AUTO_LOAD = ["md5", "safe_mode"]
@@ -82,7 +83,7 @@ BASE_OTA_SCHEMA = cv.Schema(
82
83
  )
83
84
 
84
85
 
85
- @coroutine_with_priority(CoroPriority.COMMUNICATION)
86
+ @coroutine_with_priority(CoroPriority.OTA_UPDATES)
86
87
  async def to_code(config):
87
88
  cg.add_define("USE_OTA")
88
89
 
@@ -121,15 +121,11 @@ def transport_schema(cls):
121
121
  return TRANSPORT_SCHEMA.extend({cv.GenerateID(): cv.declare_id(cls)})
122
122
 
123
123
 
124
- # Build a list of sensors for this platform
125
- CORE.data[DOMAIN] = {CONF_SENSORS: []}
126
-
127
-
128
124
  def get_sensors(transport_id):
129
125
  """Return the list of sensors for this platform."""
130
126
  return (
131
127
  sensor
132
- for sensor in CORE.data[DOMAIN][CONF_SENSORS]
128
+ for sensor in CORE.data.setdefault(DOMAIN, {}).setdefault(CONF_SENSORS, [])
133
129
  if sensor[CONF_TRANSPORT_ID] == transport_id
134
130
  )
135
131
 
@@ -137,7 +133,8 @@ def get_sensors(transport_id):
137
133
  def validate_packet_transport_sensor(config):
138
134
  if CONF_NAME in config and CONF_INTERNAL not in config:
139
135
  raise cv.Invalid("Must provide internal: config when using name:")
140
- CORE.data[DOMAIN][CONF_SENSORS].append(config)
136
+ conf_sensors = CORE.data.setdefault(DOMAIN, {}).setdefault(CONF_SENSORS, [])
137
+ conf_sensors.append(config)
141
138
  return config
142
139
 
143
140
 
@@ -217,7 +217,7 @@ void SX126x::configure() {
217
217
  this->write_opcode_(RADIO_SET_MODULATIONPARAMS, buf, 4);
218
218
 
219
219
  // set packet params and sync word
220
- this->set_packet_params_(this->payload_length_);
220
+ this->set_packet_params_(this->get_max_packet_size());
221
221
  if (this->sync_value_.size() == 2) {
222
222
  this->write_register_(REG_LORA_SYNCWORD, this->sync_value_.data(), this->sync_value_.size());
223
223
  }
@@ -236,7 +236,7 @@ void SX126x::configure() {
236
236
  this->write_opcode_(RADIO_SET_MODULATIONPARAMS, buf, 8);
237
237
 
238
238
  // set packet params and sync word
239
- this->set_packet_params_(this->payload_length_);
239
+ this->set_packet_params_(this->get_max_packet_size());
240
240
  if (!this->sync_value_.empty()) {
241
241
  this->write_register_(REG_GFSK_SYNCWORD, this->sync_value_.data(), this->sync_value_.size());
242
242
  }
@@ -274,7 +274,7 @@ void SX126x::set_packet_params_(uint8_t payload_length) {
274
274
  buf[2] = (this->preamble_detect_ > 0) ? ((this->preamble_detect_ - 1) | 0x04) : 0x00;
275
275
  buf[3] = this->sync_value_.size() * 8;
276
276
  buf[4] = 0x00;
277
- buf[5] = 0x00;
277
+ buf[5] = (this->payload_length_ > 0) ? 0x00 : 0x01;
278
278
  buf[6] = payload_length;
279
279
  buf[7] = this->crc_enable_ ? 0x06 : 0x01;
280
280
  buf[8] = 0x00;
@@ -314,6 +314,9 @@ SX126xError SX126x::transmit_packet(const std::vector<uint8_t> &packet) {
314
314
  buf[0] = 0xFF;
315
315
  buf[1] = 0xFF;
316
316
  this->write_opcode_(RADIO_CLR_IRQSTATUS, buf, 2);
317
+ if (this->payload_length_ == 0) {
318
+ this->set_packet_params_(this->get_max_packet_size());
319
+ }
317
320
  if (this->rx_start_) {
318
321
  this->set_mode_rx();
319
322
  } else {
@@ -72,6 +72,7 @@ void USBUartTypeCH34X::enable_channels() {
72
72
  if (channel->index_ >= 2)
73
73
  cmd += 0xE;
74
74
  this->control_transfer(USB_VENDOR_DEV | usb_host::USB_DIR_OUT, cmd, value, (factor << 8) | divisor, callback);
75
+ this->control_transfer(USB_VENDOR_DEV | usb_host::USB_DIR_OUT, cmd + 3, 0x80, 0, callback);
75
76
  }
76
77
  USBUartTypeCdcAcm::enable_channels();
77
78
  }
@@ -3,7 +3,8 @@ from esphome.components.esp32 import add_idf_component
3
3
  from esphome.components.ota import BASE_OTA_SCHEMA, OTAComponent, ota_to_code
4
4
  import esphome.config_validation as cv
5
5
  from esphome.const import CONF_ID
6
- from esphome.core import CORE, CoroPriority, coroutine_with_priority
6
+ from esphome.core import CORE, coroutine_with_priority
7
+ from esphome.coroutine import CoroPriority
7
8
 
8
9
  CODEOWNERS = ["@esphome/core"]
9
10
  DEPENDENCIES = ["network", "web_server_base"]
@@ -22,7 +23,7 @@ CONFIG_SCHEMA = (
22
23
  )
23
24
 
24
25
 
25
- @coroutine_with_priority(CoroPriority.COMMUNICATION)
26
+ @coroutine_with_priority(CoroPriority.WEB_SERVER_OTA)
26
27
  async def to_code(config):
27
28
  var = cg.new_Pvariable(config[CONF_ID])
28
29
  await ota_to_code(var, config)
@@ -1,7 +1,8 @@
1
1
  import esphome.codegen as cg
2
2
  import esphome.config_validation as cv
3
3
  from esphome.const import CONF_ID
4
- from esphome.core import CORE, CoroPriority, coroutine_with_priority
4
+ from esphome.core import CORE, coroutine_with_priority
5
+ from esphome.coroutine import CoroPriority
5
6
 
6
7
  CODEOWNERS = ["@esphome/core"]
7
8
  DEPENDENCIES = ["network"]
@@ -26,7 +27,7 @@ CONFIG_SCHEMA = cv.Schema(
26
27
  )
27
28
 
28
29
 
29
- @coroutine_with_priority(CoroPriority.COMMUNICATION)
30
+ @coroutine_with_priority(CoroPriority.WEB_SERVER_BASE)
30
31
  async def to_code(config):
31
32
  var = cg.new_Pvariable(config[CONF_ID])
32
33
  await cg.register_component(var, config)
@@ -39,5 +40,7 @@ async def to_code(config):
39
40
  cg.add_library("Update", None)
40
41
  if CORE.is_esp8266:
41
42
  cg.add_library("ESP8266WiFi", None)
43
+ if CORE.is_libretiny:
44
+ CORE.add_platformio_option("lib_ignore", ["ESPAsyncTCP", "RPAsyncTCP"])
42
45
  # https://github.com/ESP32Async/ESPAsyncWebServer/blob/main/library.json
43
46
  cg.add_library("ESP32Async/ESPAsyncWebServer", "3.7.10")
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.9.0b4"
7
+ __version__ = "2025.9.2"
8
8
 
9
9
  ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
10
10
  VALID_SUBSTITUTIONS_CHARACTERS = (
esphome/core/config.py CHANGED
@@ -396,7 +396,7 @@ async def add_includes(includes):
396
396
  async def _add_platformio_options(pio_options):
397
397
  # Add includes at the very end, so that they override everything
398
398
  for key, val in pio_options.items():
399
- if key == "build_flags" and not isinstance(val, list):
399
+ if key in ["build_flags", "lib_ignore"] and not isinstance(val, list):
400
400
  val = [val]
401
401
  cg.add_platformio_option(key, val)
402
402
 
esphome/coroutine.py CHANGED
@@ -90,11 +90,30 @@ class CoroPriority(enum.IntEnum):
90
90
  # Examples: status_led (80)
91
91
  STATUS = 80
92
92
 
93
+ # Web server infrastructure
94
+ # Examples: web_server_base (65)
95
+ WEB_SERVER_BASE = 65
96
+
97
+ # Network portal services
98
+ # Examples: captive_portal (64)
99
+ CAPTIVE_PORTAL = 64
100
+
93
101
  # Communication protocols and services
94
- # Examples: web_server_base (65), captive_portal (64), wifi (60), ethernet (60),
95
- # mdns (55), ota_updates (54), web_server_ota (52)
102
+ # Examples: wifi (60), ethernet (60)
96
103
  COMMUNICATION = 60
97
104
 
105
+ # Network discovery and management services
106
+ # Examples: mdns (55)
107
+ NETWORK_SERVICES = 55
108
+
109
+ # OTA update services
110
+ # Examples: ota_updates (54)
111
+ OTA_UPDATES = 54
112
+
113
+ # Web-based OTA services
114
+ # Examples: web_server_ota (52)
115
+ WEB_SERVER_OTA = 52
116
+
98
117
  # Application-level services
99
118
  # Examples: safe_mode (50)
100
119
  APPLICATION = 50
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: esphome
3
- Version: 2025.9.0b4
3
+ Version: 2025.9.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
@@ -1,12 +1,12 @@
1
1
  esphome/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- esphome/__main__.py,sha256=S3swmJYlxgWuHc3H9rS9_DwrqtEcRQ1TF9YIAIspaEs,39523
2
+ esphome/__main__.py,sha256=8hrrEXR1nGng7wvABi5Tcyd_GpMDWc2_8b8n9WfovA0,39533
3
3
  esphome/automation.py,sha256=gK_oTzOSb3X-0O82bZNYk4XjAzSecpSdvHQGcY79Rcc,15661
4
4
  esphome/codegen.py,sha256=H_WB4rj0uEowvlhEb31EjJQwutLQ5CQkJIsNgDK-wx8,1917
5
5
  esphome/config.py,sha256=74-Y3XKtlB9h__fsu-Zvj6PanDWufVGo1-W4jlG-8cg,43172
6
6
  esphome/config_helpers.py,sha256=E0UO0khX9JW-br_NSsDlLH3VuE-YwMQ99_pzEQVupDc,5391
7
7
  esphome/config_validation.py,sha256=WB_2g9itbOi2z8bo25t8AG1rKHzLZdfa_DiTYQMuxrQ,64839
8
- esphome/const.py,sha256=OJSPrWEJdmTRErus6q7bm4Ci5G8OZWQQetSOVvFoJYg,44218
9
- esphome/coroutine.py,sha256=q2Bcr0MU6CviHLYRV_0lvSo0sLKQnsVlDM0yw-JxOa4,11587
8
+ esphome/const.py,sha256=dni6notKlV9xFGceQNndBq1IS0SBG8ZrDkPirTxLXGA,44216
9
+ esphome/coroutine.py,sha256=JFBDo8ngY46zhxvjk5aQ5MO_-qrqKDfKQTglEIqHrYY,11946
10
10
  esphome/cpp_generator.py,sha256=C9O-H6ekHHdIEsfLGiqo-Sv6LZCmS0OL4A5ZGYHyh6U,32209
11
11
  esphome/cpp_helpers.py,sha256=r-hrUp7luke-ByuK2Z0TCzIvn4tTswMUkAzlVoKntiI,4039
12
12
  esphome/cpp_types.py,sha256=UkmRmwPDShPw9HauiaFuNb6eZ6RsIy2YNQXUy4_UzQ8,1960
@@ -501,7 +501,7 @@ esphome/components/cap1188/__init__.py,sha256=coel8Li86MFnLQuuHregeri04GGDVR_qqh
501
501
  esphome/components/cap1188/binary_sensor.py,sha256=Ar35IMka2lFJxLRfVaZm0qIeTCJmnoHHXcgidxmAOQ8,775
502
502
  esphome/components/cap1188/cap1188.cpp,sha256=Cm2NVNtHVzKOBKccmav87gJhRXlv_j-_mfFCTA1iSI4,2470
503
503
  esphome/components/cap1188/cap1188.h,sha256=7zsuov-u6FaC-iAR3NZOMAdi_IovL0nSVjHCJRfx9c0,1934
504
- esphome/components/captive_portal/__init__.py,sha256=vIp7cDwTIh6IjKUldJwEUEG7NZpDr8goz2xsHHmx1Ew,1743
504
+ esphome/components/captive_portal/__init__.py,sha256=tt5_GNT1CePuYgxv0DL12KTOWBRusq0nDe6TVU0w9tE,1773
505
505
  esphome/components/captive_portal/captive_index.h,sha256=QmSw30k_2BR8QUXjDSV5kot8SSoXJB4IyHi4rYukxiE,9330
506
506
  esphome/components/captive_portal/captive_portal.cpp,sha256=z_m4PR9GyttMlJgwXp0p1dAoWqI4QrxyF4IIrGlNnT4,4254
507
507
  esphome/components/captive_portal/captive_portal.h,sha256=_xHgoqPq6nuz58ktiSoaxRIHFq4WlFjy2YdFvD-zEzU,1912
@@ -929,8 +929,8 @@ esphome/components/esp32_hosted/__init__.py,sha256=crOi6AdUnpreAdJZb-OktoyyZxeU7
929
929
  esphome/components/esp32_hosted/esp32_hosted.py.script,sha256=L3YjW8b3-7I_Cy4V95y_UGFfdKh3UqhMarwCxoVJMKw,375
930
930
  esphome/components/esp32_improv/__init__.py,sha256=qzIyscmQ6VVKCGR9B7UE7hf4IsKltQ3PrsQcL-slrrU,5490
931
931
  esphome/components/esp32_improv/automation.h,sha256=S2_sD9RlE1B6lWaH_l_6n5ObBB1zhQ4EDxrzOcQuvRw,2042
932
- esphome/components/esp32_improv/esp32_improv_component.cpp,sha256=Xcz2MB0ducU915w1u7ITjXCDcQaSomIIDK2hggUpSKg,12348
933
- esphome/components/esp32_improv/esp32_improv_component.h,sha256=zVIHGaJd4qelR6it2I65VWHMJ-7DfCsV6fSyLL-F688,3455
932
+ esphome/components/esp32_improv/esp32_improv_component.cpp,sha256=PzAURhc6XPZ11a5_k68NmcBrMw92JdPZRTiqaXkkhYw,14383
933
+ esphome/components/esp32_improv/esp32_improv_component.h,sha256=ye1i5rcjC_H7qcVkPQ_a_nAsQ8H_sppVOZSs09Qw10k,3608
934
934
  esphome/components/esp32_rmt/__init__.py,sha256=S_2Wjyp9R8RZ5i_BiJToXVJHAduDHPplP-rTODgvKw0,674
935
935
  esphome/components/esp32_rmt_led_strip/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
936
936
  esphome/components/esp32_rmt_led_strip/led_strip.cpp,sha256=uDBStKKGj4b66PzzHiwH1a7KZIK17RdV0UQ94KabtsA,8789
@@ -961,7 +961,7 @@ esphome/components/esp8266_pwm/output.py,sha256=s5sMTbATthPAJCJyTwvIBYQAoEcffAGx
961
961
  esphome/components/esp_ldo/__init__.py,sha256=bBEaDXgqzFtcRSOcUttuA8VGJnayYjLU-zhvzGw8UiU,2892
962
962
  esphome/components/esp_ldo/esp_ldo.cpp,sha256=cAnIUUnO9EGLEx2y0cZ7eT5eVeollwTxFLGQUdZ9sP8,1506
963
963
  esphome/components/esp_ldo/esp_ldo.h,sha256=M5pLF6Wv1_CasrOHDG9e6UIYD-7KNVbZtXk0uAt61Bc,1130
964
- esphome/components/esphome/ota/__init__.py,sha256=bjgNF0mBM8flL-Ixz__9dfWoZh2qpSeMSv02eOR29Ck,4880
964
+ esphome/components/esphome/ota/__init__.py,sha256=opem51qNyCwBjMbYlpfM0I-JpwS6qtkBJ6VPO6x-UsI,4907
965
965
  esphome/components/esphome/ota/ota_esphome.cpp,sha256=fjZiMSzypM0mI5JhROObX3h6XILbAeJbe7HdCzmXuT4,15980
966
966
  esphome/components/esphome/ota/ota_esphome.h,sha256=bZPXLSRRFEePIXlRhfSoCAXOoh4EEK1U5Ue9VZUdeaY,1496
967
967
  esphome/components/espnow/__init__.py,sha256=ZMz0wyAmx4VW8dewtRhvSu3-TiCMbjVswF8_PvgxcvA,9780
@@ -1078,7 +1078,7 @@ esphome/components/gp8403/output/gp8403_output.cpp,sha256=FQPUa_ZMgLz7LNHy6N8sNU
1078
1078
  esphome/components/gp8403/output/gp8403_output.h,sha256=wJd_-CtUSxw5ujhR21E1zCiB9hvpl3Ktt665D3iQLf4,598
1079
1079
  esphome/components/gpio/__init__.py,sha256=afIFpPG_fsom-8vYV1yRyvhSCFyASlAdraUCuztWQZ4,103
1080
1080
  esphome/components/gpio/binary_sensor/__init__.py,sha256=1rCKRDCrbINcJN6m0gRYgyGTouuVpK-s_IV6cGgivUE,3594
1081
- esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp,sha256=Aop6U6PUS-eRCyInbg_ySQH44lXuHWB7thIpNCP3VJ8,3242
1081
+ esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp,sha256=Zoh2hzMQfkyQKOx1BonO0KmR5qZA199d0Ab8Rrc9V7E,3298
1082
1082
  esphome/components/gpio/binary_sensor/gpio_binary_sensor.h,sha256=ukwmyxJhiYXMczcT16zwdliTX5Brf8fdgDzid6l13wE,2000
1083
1083
  esphome/components/gpio/one_wire/__init__.py,sha256=oH6-6zy18pG_7iqzLegjh4AbjnbZHqBRZKHdHBI-828,714
1084
1084
  esphome/components/gpio/one_wire/gpio_one_wire.cpp,sha256=jTzIEfdY08duQCnA4NgoEY6jkZWj0ozFL5i1sk6ixlg,5092
@@ -1178,7 +1178,7 @@ esphome/components/he60r/cover.py,sha256=83aWhKtJEOLFQLxufXEmBrfDPEP-M-I4Pf_sqh1
1178
1178
  esphome/components/he60r/he60r.cpp,sha256=W2jb-ga2gTS5xfHsxNnFUDr6qawTvzywonh6VTW1k88,8737
1179
1179
  esphome/components/he60r/he60r.h,sha256=ACMuRuz-0RAh7kp6ndkV-9qcq1XOyF_4UIXyaPXC8uQ,1371
1180
1180
  esphome/components/heatpumpir/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1181
- esphome/components/heatpumpir/climate.py,sha256=-kCsZFhNwgfj7hCI6AhhXHflmUt1exi4VLFTL-LAASM,5582
1181
+ esphome/components/heatpumpir/climate.py,sha256=QtLWwKuoh1L0qctB8y513FOBA5BAMgNEC5K3o7le7AQ,5584
1182
1182
  esphome/components/heatpumpir/heatpumpir.cpp,sha256=GXnwvflFDXl9dPnkFEXIenT1WbjV-DrcLjV3jWON4FU,10062
1183
1183
  esphome/components/heatpumpir/heatpumpir.h,sha256=2jmYpGvxTlGs_hfEmB05oAsl3OfwLY4joRDSKQShNy0,3807
1184
1184
  esphome/components/heatpumpir/ir_sender_esphome.cpp,sha256=MOAYkculr1fFhFIa3_12yLZFblDcWBlvFyr5cQtMYIQ,734
@@ -1270,7 +1270,7 @@ esphome/components/http_request/http_request_host.h,sha256=QOy297CGwGs7xPRos3QOl
1270
1270
  esphome/components/http_request/http_request_idf.cpp,sha256=-kZGq23MRXZabnLyiv-iTUCMu-tkN_knkoI5UbuUxVw,7629
1271
1271
  esphome/components/http_request/http_request_idf.h,sha256=mSwxYFbkN1pg8bba_VfZPOpj6mGzxggmxWYTSbaJjec,1611
1272
1272
  esphome/components/http_request/httplib.h,sha256=VoILM8ZYZ2B-IV6Z6eb3BPvGOfig-Ccm7e9UVGNY10Q,330380
1273
- esphome/components/http_request/ota/__init__.py,sha256=2q4BW_ZI6WR9ujeu4kEoGU1IZpnQhqhKCsDyo_KNOi0,3218
1273
+ esphome/components/http_request/ota/__init__.py,sha256=QpeQ5KW63A7R6Zj3ITsSBUOOLo__ifbahwZT4WTwNt4,3245
1274
1274
  esphome/components/http_request/ota/automation.h,sha256=yQo6nJis0S56r5F-tIPbRPqPZMcu0Lpcawr2cX92Ap4,1209
1275
1275
  esphome/components/http_request/ota/ota_http_request.cpp,sha256=PyandFqtBgBm_wUTcZExvCqDiIDyyP2NFopzsyBACRg,8731
1276
1276
  esphome/components/http_request/ota/ota_http_request.h,sha256=X0SFnzhpCY_S7QLJKRiEb7pTTtrj0qWfTSXC_jMLS2E,1787
@@ -1852,7 +1852,7 @@ esphome/components/mcp9808/sensor.py,sha256=8dSMS73S0pbANOyfJDpeQu8YV1x8YayyEGp-
1852
1852
  esphome/components/md5/__init__.py,sha256=UMOzKlaVJtzYULytE5P3aZOdVPKrdJAQb-NLxUQ4UUE,119
1853
1853
  esphome/components/md5/md5.cpp,sha256=bMBkIoYH9rQt1_jALhJFMHztqtTUuEMznTFeRQbLcsw,1796
1854
1854
  esphome/components/md5/md5.h,sha256=Q_qTnrjgWuyE-5j2366KgZdzL2253n0sCafU7ZozXN8,1476
1855
- esphome/components/mdns/__init__.py,sha256=1xXPsV11VbpQVjCiCbjsLKTp27JUYa7mrqnIqE50n5g,3673
1855
+ esphome/components/mdns/__init__.py,sha256=7_J0-06SlGHkHWWUrf_7xkqWfXk8vB1L-yjnHzBaS2c,3705
1856
1856
  esphome/components/mdns/mdns_component.cpp,sha256=hSbIXyRaatXUwr2ByMFTYC_sCGoilinfIXGdle9nR2I,8366
1857
1857
  esphome/components/mdns/mdns_component.h,sha256=hCM2noT922YAEt87sMK6pS8X4YtRR3n9BqSaBGpVrJQ,1438
1858
1858
  esphome/components/mdns/mdns_esp32.cpp,sha256=dt6O4bgq1dDfXIaH7LBZUkcXFAMpOE-2RKY3VkkvTrE,1829
@@ -1919,7 +1919,7 @@ esphome/components/midea_ir/climate.py,sha256=SIGjpEuW2nJbXh_SjKz1Tt5zkqqC65bsZp
1919
1919
  esphome/components/midea_ir/midea_data.h,sha256=XOHDD0CzimykTCRGWqgQGIhDgmd0bXL1AjWscswO5OE,2783
1920
1920
  esphome/components/midea_ir/midea_ir.cpp,sha256=5RJ1Igf_SCFOj2OwrS3n-_aAVfQPVNjiVFqi7cHwyJE,6666
1921
1921
  esphome/components/midea_ir/midea_ir.h,sha256=BNVdX5xjpFy-q0OTgBubUpFA_GQgUeK3Vx7rahOT-nM,1518
1922
- esphome/components/mipi/__init__.py,sha256=NH9h0iXkps6mMlyhN9wTZqELt3tEITDogsLY0dshQZk,15452
1922
+ esphome/components/mipi/__init__.py,sha256=SLZnWHYHE-Nzp2imYn-FhuGGHPWhA9vRE56bK3mWVTw,15742
1923
1923
  esphome/components/mipi_dsi/__init__.py,sha256=0xobDY4ImBcQod3BD1spYTLRg5gBGGJiuPx8R4KYApY,111
1924
1924
  esphome/components/mipi_dsi/display.py,sha256=5atj0wGqzBTuM9CvbLjHB9mCcyGiYe3xhMVSJC5fxog,8060
1925
1925
  esphome/components/mipi_dsi/mipi_dsi.cpp,sha256=WrZxI9snPhBfM2S2E53vmUltnW5uLWUwkT5fkuEMvhM,14254
@@ -1936,14 +1936,14 @@ esphome/components/mipi_rgb/models/guition.py,sha256=WnkzED6GAYg5PA0_mapH-s4oeM7
1936
1936
  esphome/components/mipi_rgb/models/lilygo.py,sha256=RRQYMCPZUcXUPfCPxWKnXQ7wErHRGc8whWYrV3sF5WQ,6564
1937
1937
  esphome/components/mipi_rgb/models/rpi.py,sha256=TsfdCw1R34KkuWjdcpr86QVlAWKcnE3cGO7Xv6Kjokc,248
1938
1938
  esphome/components/mipi_rgb/models/st7701s.py,sha256=AOOwVcOb7kOc7L_sb59-7edyIuEbW-z4x6c5o_tW_Q8,8395
1939
- esphome/components/mipi_rgb/models/waveshare.py,sha256=sIk5sBamlR6xMXspjjthiXcRMfINAZ48RR9ya8fWpwU,1595
1939
+ esphome/components/mipi_rgb/models/waveshare.py,sha256=iEYTdtiuGCgL4zdsdljSVrwUZZgmS8vpHwX8UzbyERE,1618
1940
1940
  esphome/components/mipi_spi/__init__.py,sha256=XJwpaWKr4Ldgbuja4FdSVVpj-0q1Ef67Qmdg-SkTR7o,102
1941
1941
  esphome/components/mipi_spi/display.py,sha256=TYnbrJczX_cnpG-mw0Hj6IwBVWvfIFMcBwRxdb6Xpqc,15318
1942
1942
  esphome/components/mipi_spi/mipi_spi.cpp,sha256=atqJGYm2bPQOfMrgzjfCgjxrryanTXOieAqANXj4bgU,142
1943
1943
  esphome/components/mipi_spi/mipi_spi.h,sha256=HKzar37uF9edHepg7J4yXIV7-a1OqiSqE7uHyLnN1M4,23289
1944
1944
  esphome/components/mipi_spi/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1945
1945
  esphome/components/mipi_spi/models/adafruit.py,sha256=Izz_5WeYuxbDQv-5Ixtm_hrdggT1drVLbTafV4TsJbM,482
1946
- esphome/components/mipi_spi/models/amoled.py,sha256=wgheG3KGp2dxo7fRLTnk1XW_8gLQ4wOUIvTkW_Gre_o,1922
1946
+ esphome/components/mipi_spi/models/amoled.py,sha256=Ac1L4Bf-ZZLTdgGYcqyj3XnQer04RcBXP7UjHi_ZsKM,1978
1947
1947
  esphome/components/mipi_spi/models/cyd.py,sha256=4kAD8U4h1HNpgT-3lum7Zt-DkldHoG2_50PbSPeTYLw,131
1948
1948
  esphome/components/mipi_spi/models/ili.py,sha256=cM0_-S116aHZLjenHcPXZ1jrNROWfbNHm9HOWsZ6URk,15036
1949
1949
  esphome/components/mipi_spi/models/jc.py,sha256=3tBxkMWL6vvEBHj16ivGRp9qZmuQk5tAP-kTlRCBxOk,10319
@@ -2256,7 +2256,7 @@ esphome/components/opt3001/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
2256
2256
  esphome/components/opt3001/opt3001.cpp,sha256=ZM1SQwXupDHYpslMx26QSl7qb3KNDc6DUPnpgy-QtIs,4221
2257
2257
  esphome/components/opt3001/opt3001.h,sha256=kV1FgTvHWk56QL7M7cIIOmupF59FRBk7t9EuNvMcIBY,782
2258
2258
  esphome/components/opt3001/sensor.py,sha256=3EdGmBCpfPzTMaosAjYbZQPqQb7AEAKRR6Mc4bJyHvs,892
2259
- esphome/components/ota/__init__.py,sha256=5FUGQGro63qdwF4pgGp8eSiXRtAH-5zN_CiqQq5L6YY,5051
2259
+ esphome/components/ota/__init__.py,sha256=zUOT-_DVW9VHz1JNnsE9TzR4PMjimEv-L46WouVZiDU,5078
2260
2260
  esphome/components/ota/automation.h,sha256=0GhgDicYedDmMTX-yomlw-Ssl-B_2RbE0FDcTJTM0Ns,2037
2261
2261
  esphome/components/ota/ota_backend.cpp,sha256=IfpR0mvzSs9ugJa2LRi4AtYHT4Ht6PoS9BY5Ydjs_eE,587
2262
2262
  esphome/components/ota/ota_backend.h,sha256=GLTNB5ynFx8MmV5RePtdAxdB-7o8ubz5RLN91kiln1Y,3830
@@ -2286,7 +2286,7 @@ esphome/components/output/switch/__init__.py,sha256=yWYf5A46HDvaAHDyUhisP_SQeRwj
2286
2286
  esphome/components/output/switch/output_switch.cpp,sha256=_NpPnnJyuVVClOxMVcAij9UVdiap3oLQJgsG6sTKyxI,636
2287
2287
  esphome/components/output/switch/output_switch.h,sha256=irORSQtpjDivfCCaBQCHMek1AO5MPxH-ZfiTBitJajc,609
2288
2288
  esphome/components/packages/__init__.py,sha256=ybF-I7HrXhAe1wbFwjPWWtfS0UbjOOBkbxCCsM1HkZc,6395
2289
- esphome/components/packet_transport/__init__.py,sha256=EHHIM7YRTpEq6I71Pq6vMIrUhQsLBxVBGDVhTp2gzdU,6361
2289
+ esphome/components/packet_transport/__init__.py,sha256=Xrpf78g7xk3DZCAETFghQx6Nbmy5hp240o9zpxCRua8,6368
2290
2290
  esphome/components/packet_transport/binary_sensor.py,sha256=vysjJ9KDTzDssdNOlOT_tNVLT3jv5a_GRw1H5czPBLY,2329
2291
2291
  esphome/components/packet_transport/packet_transport.cpp,sha256=orygb4kg5L15h6p3i5mLQXCyKje19yDTBb3BMdML61Q,17360
2292
2292
  esphome/components/packet_transport/packet_transport.h,sha256=8REDLYgpT3tjQyvpfz3eb_WKUJN9MXqN3x9Rdt7ndOk,5029
@@ -3073,7 +3073,7 @@ esphome/components/switch/binary_sensor/switch_binary_sensor.cpp,sha256=ZPwaqXQT
3073
3073
  esphome/components/switch/binary_sensor/switch_binary_sensor.h,sha256=xTqZLNBeZl6oah0rzOiuBfeeLTUnl-hSMzLALWhuOog,462
3074
3074
  esphome/components/sx126x/__init__.py,sha256=ESYxzsog9kId6zUOE6AVohHp2UzQNM8gCB-ZnOwlDYA,11941
3075
3075
  esphome/components/sx126x/automation.h,sha256=fgt45VPE4CbumQ7Cj8fsd5oKZSxDazoZROo4_sij-x0,1824
3076
- esphome/components/sx126x/sx126x.cpp,sha256=d6SAHuxhT5wADV0MqiM4LYreo9v6Y0v5Fb7WPnkExl4,16680
3076
+ esphome/components/sx126x/sx126x.cpp,sha256=IrhWIBH7dG8_teDeOQ5G65iaPM9_hDEtlZSKrLw0YvM,16828
3077
3077
  esphome/components/sx126x/sx126x.h,sha256=-jHgmn1dNUwwGf1eGrU19Z3BxwpFX49JxoVxSUlMQjM,5312
3078
3078
  esphome/components/sx126x/sx126x_reg.h,sha256=GSWkorZRYDeqMO8oTIozvfL2WLYAz66y3o7QeE9LlfY,3742
3079
3079
  esphome/components/sx126x/packet_transport/__init__.py,sha256=pQohjHA2lZTqq3ziua_W1_DVkIY6ldh1WVzh80c8zvA,716
@@ -3438,7 +3438,7 @@ esphome/components/usb_host/usb_host.h,sha256=Bi1Y0ZQd_ecbEhIXdnfgO7fPEoWXxjN-hZ
3438
3438
  esphome/components/usb_host/usb_host_client.cpp,sha256=janrFosfaoDlNz5tZn7k7v3LSVN6mzr-AK41VAyT13g,14598
3439
3439
  esphome/components/usb_host/usb_host_component.cpp,sha256=wY11HpSN4Ql4puDl6qN1wKk6FW1IfnAVwxHRC4AFq5Y,916
3440
3440
  esphome/components/usb_uart/__init__.py,sha256=hj_dUGWhiwrlhZaiMrY4j8IX_Kn3EIk3JfCCrths7so,4951
3441
- esphome/components/usb_uart/ch34x.cpp,sha256=Frz9ZsQqCJGdU8gwl7VNoNHDAgoh5ufHX43oQpNg17o,2321
3441
+ esphome/components/usb_uart/ch34x.cpp,sha256=7l1NrFJMN7LbXKQ6bdOHtsmCuxcMGqyTGAmj_sIJtkA,2417
3442
3442
  esphome/components/usb_uart/cp210x.cpp,sha256=8h_-Rr0Hy7BBisGhbOulTaJUYO8_HlMZBVUj35UPqk8,6006
3443
3443
  esphome/components/usb_uart/usb_uart.cpp,sha256=oWsXwuZhvbFd9IHtrTPr_P7ezyDynllVP5nMNc17Nlw,12872
3444
3444
  esphome/components/usb_uart/usb_uart.h,sha256=z6I-t409XJcVSsvWgGk_HvscM8nsmZM6593XP-qYyUE,4977
@@ -3498,10 +3498,10 @@ esphome/components/web_server/server_index_v3.h,sha256=5SZfSHDG4xAyXNBxUqs8-jSVw
3498
3498
  esphome/components/web_server/web_server.cpp,sha256=lOdalJ1wTpkAOLnBvanxFqKXVV4lDcHzWBN4Qhe4SuI,69812
3499
3499
  esphome/components/web_server/web_server.h,sha256=ZxpyQSeUB3Kj65CTW2MJDeAUl5Kv0PN6FFRRTE4hOBA,23987
3500
3500
  esphome/components/web_server/web_server_v1.cpp,sha256=ZnFV1J2YAzAT2mtR-eeVgG1TSVpy953EF1yVKYdTcTg,7409
3501
- esphome/components/web_server/ota/__init__.py,sha256=YlTWM4tpW0SQfsBkABImHZQzOhJmykr0Qu0Kfnp2m7s,1054
3501
+ esphome/components/web_server/ota/__init__.py,sha256=VrKoEguXiiFcZ3sxV_i1WpA6MKtDM2gqgdoNV_HkfhY,1084
3502
3502
  esphome/components/web_server/ota/ota_web_server.cpp,sha256=1HRC-pcl-fEVnv5hXQ5UXUSRgSfr5mdCUQWC4G-dWCU,8676
3503
3503
  esphome/components/web_server/ota/ota_web_server.h,sha256=ZZQHTxb21gqukibGei-om00MxpBD4Qyy031PXBMmjT8,604
3504
- esphome/components/web_server_base/__init__.py,sha256=fgdIDccaJonikSIdw7CIlThJzkkpxCqK-Opuc5HNVxI,1319
3504
+ esphome/components/web_server_base/__init__.py,sha256=dcBEt4dQahZVrK-3FsMG1C-1qzsc08OM4QQECLuq-F8,1464
3505
3505
  esphome/components/web_server_base/web_server_base.cpp,sha256=VlAnKn1jhHVca2LUL32CJRKTIvNKpxXTs4KLHw9he-E,909
3506
3506
  esphome/components/web_server_base/web_server_base.h,sha256=xKlrCAtThydv7SxJohZJ1cLirtZgSQ34Qk1Ldnn0WPM,4150
3507
3507
  esphome/components/web_server_idf/__init__.py,sha256=suQYP-zxgx9bk7qmUVQ0P8FkwXqajUKDoEwenxD20Hg,409
@@ -3715,7 +3715,7 @@ esphome/core/component.cpp,sha256=VBNDcx54BPCRkPkFjDqH3o0TLY1pehZoEEvZkwHAmiY,18
3715
3715
  esphome/core/component.h,sha256=5GuAD5chzeqP3lcgyeFrTB66IItADmvZ4025Gw8yBKE,18089
3716
3716
  esphome/core/component_iterator.cpp,sha256=6EO7M9iL3wjtC84_EeJ9EOCQi7QNKWyqK-56G3Ze9Uo,5341
3717
3717
  esphome/core/component_iterator.h,sha256=Opa1AmbsPR1S4b6aWwqRksajo7G5V2FLiSQA1p-z6n4,4279
3718
- esphome/core/config.py,sha256=VQb2e4WIyGJapk0aIOywRyUZx2WC10aI3O49eJ_ItlM,20277
3718
+ esphome/core/config.py,sha256=F3Rt2qoXEEaonikHPm1fsGaIex34d_zKl0WG6fgUzmc,20293
3719
3719
  esphome/core/controller.cpp,sha256=nRJZK4B5WWad98tGGEESSGcKWcpWhExaUOIXO3Iu_xQ,4602
3720
3720
  esphome/core/controller.h,sha256=UCvtMbw21KvAQHaO_fgDRr1OjcXEYzEC8JupPmHrNic,3708
3721
3721
  esphome/core/datatypes.h,sha256=TNuXjWQIK7KjDwMAccMFws2SimaUlsgim96SI0cCdCY,2110
@@ -3766,9 +3766,9 @@ esphome/dashboard/util/itertools.py,sha256=8eLrWEWmICLtXNxkKdYPQV0c_N4GEz8m9Npnb
3766
3766
  esphome/dashboard/util/password.py,sha256=cQz3b9B-ijTe7zS6BeCW0hc3pWv6JjC78jmnycYYAh8,321
3767
3767
  esphome/dashboard/util/subprocess.py,sha256=T8EW6dbU4LPd2DG1dRrdh8li71tt6J1isn411poMhkk,1022
3768
3768
  esphome/dashboard/util/text.py,sha256=wwFtORlvHjsYkqb68IT-772LHAhWxT4OtnkIcPICQB0,317
3769
- esphome-2025.9.0b4.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3770
- esphome-2025.9.0b4.dist-info/METADATA,sha256=Tqq-x-J8pFDxL0NdKjhu3gkOzagg4xnE2V4TBtFm8Es,3634
3771
- esphome-2025.9.0b4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
3772
- esphome-2025.9.0b4.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3773
- esphome-2025.9.0b4.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3774
- esphome-2025.9.0b4.dist-info/RECORD,,
3769
+ esphome-2025.9.2.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3770
+ esphome-2025.9.2.dist-info/METADATA,sha256=cz24zWMTn8EgyiBvfQ5Fgi9GAIQGKIO0gvyxAEwx5T4,3632
3771
+ esphome-2025.9.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
3772
+ esphome-2025.9.2.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3773
+ esphome-2025.9.2.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3774
+ esphome-2025.9.2.dist-info/RECORD,,