esphome 2025.9.1__py3-none-any.whl → 2025.9.3__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.
@@ -193,6 +193,7 @@ async def to_code(config):
193
193
  if key := encryption_config.get(CONF_KEY):
194
194
  decoded = base64.b64decode(key)
195
195
  cg.add(var.set_noise_psk(list(decoded)))
196
+ cg.add_define("USE_API_NOISE_PSK_FROM_YAML")
196
197
  else:
197
198
  # No key provided, but encryption desired
198
199
  # This will allow a plaintext client to provide a noise key,
@@ -37,12 +37,14 @@ void APIServer::setup() {
37
37
 
38
38
  this->noise_pref_ = global_preferences->make_preference<SavedNoisePsk>(hash, true);
39
39
 
40
+ #ifndef USE_API_NOISE_PSK_FROM_YAML
41
+ // Only load saved PSK if not set from YAML
40
42
  SavedNoisePsk noise_pref_saved{};
41
43
  if (this->noise_pref_.load(&noise_pref_saved)) {
42
44
  ESP_LOGD(TAG, "Loaded saved Noise PSK");
43
-
44
45
  this->set_noise_psk(noise_pref_saved.psk);
45
46
  }
47
+ #endif
46
48
  #endif
47
49
 
48
50
  // Schedule reboot if no clients connect within timeout
@@ -409,6 +411,12 @@ void APIServer::set_reboot_timeout(uint32_t reboot_timeout) { this->reboot_timeo
409
411
 
410
412
  #ifdef USE_API_NOISE
411
413
  bool APIServer::save_noise_psk(psk_t psk, bool make_active) {
414
+ #ifdef USE_API_NOISE_PSK_FROM_YAML
415
+ // When PSK is set from YAML, this function should never be called
416
+ // but if it is, reject the change
417
+ ESP_LOGW(TAG, "Key set in YAML");
418
+ return false;
419
+ #else
412
420
  auto &old_psk = this->noise_ctx_->get_psk();
413
421
  if (std::equal(old_psk.begin(), old_psk.end(), psk.begin())) {
414
422
  ESP_LOGW(TAG, "New PSK matches old");
@@ -437,6 +445,7 @@ bool APIServer::save_noise_psk(psk_t psk, bool make_active) {
437
445
  });
438
446
  }
439
447
  return true;
448
+ #endif
440
449
  }
441
450
  #endif
442
451
 
@@ -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)
@@ -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"])
@@ -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),
@@ -288,11 +288,15 @@ void Sim800LComponent::parse_cmd_(std::string message) {
288
288
  if (item == 3) { // stat
289
289
  uint8_t current_call_state = parse_number<uint8_t>(message.substr(start, end - start)).value_or(6);
290
290
  if (current_call_state != this->call_state_) {
291
- ESP_LOGD(TAG, "Call state is now: %d", current_call_state);
292
- if (current_call_state == 0)
293
- this->call_connected_callback_.call();
291
+ if (current_call_state == 4) {
292
+ ESP_LOGV(TAG, "Premature call state '4'. Ignoring, waiting for RING");
293
+ } else {
294
+ this->call_state_ = current_call_state;
295
+ ESP_LOGD(TAG, "Call state is now: %d", current_call_state);
296
+ if (current_call_state == 0)
297
+ this->call_connected_callback_.call();
298
+ }
294
299
  }
295
- this->call_state_ = current_call_state;
296
300
  break;
297
301
  }
298
302
  // item 4 = ""
@@ -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
  }
@@ -242,7 +242,6 @@ void VoiceAssistant::loop() {
242
242
  msg.flags = flags;
243
243
  msg.audio_settings = audio_settings;
244
244
  msg.set_wake_word_phrase(StringRef(this->wake_word_));
245
- this->wake_word_ = "";
246
245
 
247
246
  // Reset media player state tracking
248
247
  #ifdef USE_MEDIA_PLAYER
@@ -40,5 +40,7 @@ async def to_code(config):
40
40
  cg.add_library("Update", None)
41
41
  if CORE.is_esp8266:
42
42
  cg.add_library("ESP8266WiFi", None)
43
+ if CORE.is_libretiny:
44
+ CORE.add_platformio_option("lib_ignore", ["ESPAsyncTCP", "RPAsyncTCP"])
43
45
  # https://github.com/ESP32Async/ESPAsyncWebServer/blob/main/library.json
44
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.1"
7
+ __version__ = "2025.9.3"
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: esphome
3
- Version: 2025.9.1
3
+ Version: 2025.9.3
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=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=jyk_TlA6GkZ3wRw9Hi5Spy8Vp_GjFxHJYDczpt2J-9s,44216
8
+ esphome/const.py,sha256=v4NZQsLgA6fp-PI1kpI27_RO_FBQB2ipORw27rOGoSg,44216
9
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
@@ -186,7 +186,7 @@ esphome/components/apds9960/apds9960.cpp,sha256=gZ-S_di-EBVqSsUhU1n5hDoRDQcSCgRH
186
186
  esphome/components/apds9960/apds9960.h,sha256=oFrXPQrPDS16gNSVdN1n6SKuvjwc9LdvpKJckr5Tbdc,2136
187
187
  esphome/components/apds9960/binary_sensor.py,sha256=MvCYb6pTgOU48TMm_YhN6uHKkoFKFvhma3lwQQD9xfM,787
188
188
  esphome/components/apds9960/sensor.py,sha256=vUPm5H_IFROftGlMJWfgqSzm0IeLpYh5DvtA_DL1Amk,872
189
- esphome/components/api/__init__.py,sha256=gykiBGPNJjTVImCdEhd2pjhXacsW74SYxnva0m01wBE,13668
189
+ esphome/components/api/__init__.py,sha256=Hwlf6Vol0eMypmXihunJZs9BCiWUIoTN2__SxurMZIg,13725
190
190
  esphome/components/api/api_connection.cpp,sha256=FkJBD0mS8K4C0ctLbQunbTDsknAqLN7nC6ow6EmhIj0,79414
191
191
  esphome/components/api/api_connection.h,sha256=53QLFyMSv82wrJmWktzHRDo-3eN2iJQ5jcq8RZiuNE8,32317
192
192
  esphome/components/api/api_frame_helper.cpp,sha256=0XQbwgbkO2lKnhi5G00FyNlXf75n-h_RGzDRiHfD36o,9432
@@ -202,7 +202,7 @@ esphome/components/api/api_pb2_dump.cpp,sha256=ysPbqRpydU1t41TNvPxJKT6jn3_SK-FQM
202
202
  esphome/components/api/api_pb2_includes.h,sha256=-b4f04JlUZPkWcYsnErZrDePKzaa-5yknHn7hHUDaTk,754
203
203
  esphome/components/api/api_pb2_service.cpp,sha256=bWPE7AIoj5vT-xYhou5c4ZUdj3tj0cEShBWycy5LmCs,27870
204
204
  esphome/components/api/api_pb2_service.h,sha256=1CpLZ2Cpa79N0-CPmeVJVBh3AtWuW8UsGzeq_CwZYKU,16579
205
- esphome/components/api/api_server.cpp,sha256=BdgGP40ej2arxV-E1_tgN4V1QzPaJweB_Cm0fn-cKQs,14389
205
+ esphome/components/api/api_server.cpp,sha256=Ro4z5YhcWVqSOHLDJ8FwhTvfd_BcsvdzPLqlq0s6ATs,14683
206
206
  esphome/components/api/api_server.h,sha256=Ft8v8PzjKVdwdQV7dHZFH4WcNF1t5kIGuJ0XNixETTg,6588
207
207
  esphome/components/api/client.py,sha256=P-A2yc_ER2TjVzZHMlDEBdIMe1oDbufvlCPVzOzOcMM,2597
208
208
  esphome/components/api/custom_api_device.h,sha256=4IhQQx8JRXA0x8jxE1S9UihZ1eBmfG4Vm8I8_IHp9Rw,10466
@@ -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
@@ -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
@@ -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
@@ -2844,7 +2844,7 @@ esphome/components/sigma_delta_output/sigma_delta_output.h,sha256=5Nkgq9F9LbXOE3
2844
2844
  esphome/components/sim800l/__init__.py,sha256=Fx2JVqS0SdCpmYZnuHEG9M0eqj4ekhVH_wmrjRr0fIc,7313
2845
2845
  esphome/components/sim800l/binary_sensor.py,sha256=cKPXBJEySCEOg8m2NcCPD7B03iVBj9weDUsUjm4Rkzk,847
2846
2846
  esphome/components/sim800l/sensor.py,sha256=RnklgI0cekA0WcTn3LYYAX67uMxsb2PISSUvvJK04VA,971
2847
- esphome/components/sim800l/sim800l.cpp,sha256=2hLw5_c3EoVoBvLgVVCTCXcF-e7h44nNFqfLi69DSKg,15841
2847
+ esphome/components/sim800l/sim800l.cpp,sha256=APucBtLSwM2UlqkZDiuIszq47Z0h8AUkRWvfl6O1vhQ,16022
2848
2848
  esphome/components/sim800l/sim800l.h,sha256=sPmBGGWieb5fAs7Uw9VDwh7XTJdz4XRKrHqhsCqMfQY,6562
2849
2849
  esphome/components/slow_pwm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2850
2850
  esphome/components/slow_pwm/output.py,sha256=S2NKDvvaSKyZLKWXY3A4sNJmXvJgNSD6wjH5YkbOGAY,2514
@@ -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
@@ -3474,7 +3474,7 @@ esphome/components/vl53l0x/sensor.py,sha256=qQVBjhMl_nGbzuAHY0Fz2GnG5TkNJLuyFRYm
3474
3474
  esphome/components/vl53l0x/vl53l0x_sensor.cpp,sha256=FpPH9go71ehCR1sJ7ukJZ2ndXYuWAJ4t5ISClCi6xSg,15050
3475
3475
  esphome/components/vl53l0x/vl53l0x_sensor.h,sha256=_GZqT0tHSoYbqrHiC0_PAttk3cuHH9sy1lirQaIYfQU,2593
3476
3476
  esphome/components/voice_assistant/__init__.py,sha256=cYEmZoI6w05kMF_ZrFHgsvKOLGO1GIT-a3aUWqepNt4,15264
3477
- esphome/components/voice_assistant/voice_assistant.cpp,sha256=PuMewYCsQJIhPbBHcLpEn2kkRhg1ltLUw5tC5I2EV3s,34112
3477
+ esphome/components/voice_assistant/voice_assistant.cpp,sha256=tDU17VPc1PR-SprEYOr7Y3vqB4KXhQm9KakifplwCFI,34083
3478
3478
  esphome/components/voice_assistant/voice_assistant.h,sha256=dNPJHpjnu-kDlHD861cDmwxw0yYbCBOU4VM2J2opSN0,12475
3479
3479
  esphome/components/voltage_sampler/__init__.py,sha256=IU5YrROZSNyuAP1d6M_V3ZGAwNjXCHPcVy5nMjZ953Y,155
3480
3480
  esphome/components/voltage_sampler/voltage_sampler.h,sha256=Y67FLOpOzW29v29BRRyYgEmGZ_B8QnUUaqJMH6FA3jM,337
@@ -3501,7 +3501,7 @@ esphome/components/web_server/web_server_v1.cpp,sha256=ZnFV1J2YAzAT2mtR-eeVgG1TS
3501
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=rEb7lG5G04W1IU6as-RWogTGwSmiEUh5cs8eibkSYEg,1350
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.1.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3770
- esphome-2025.9.1.dist-info/METADATA,sha256=n3ld_oeY7FeDe2SucDcIarpSD1-wamLXY8IJWrw2ZQI,3632
3771
- esphome-2025.9.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
3772
- esphome-2025.9.1.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3773
- esphome-2025.9.1.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3774
- esphome-2025.9.1.dist-info/RECORD,,
3769
+ esphome-2025.9.3.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3770
+ esphome-2025.9.3.dist-info/METADATA,sha256=QJPzuEnHjhwIL10lCofR6Z57tw3rvndElbfG_l8HBPE,3632
3771
+ esphome-2025.9.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
3772
+ esphome-2025.9.3.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3773
+ esphome-2025.9.3.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3774
+ esphome-2025.9.3.dist-info/RECORD,,