esphome 2025.7.0b2__py3-none-any.whl → 2025.7.0b3__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.

@@ -20,14 +20,16 @@ adjusted_ids = set()
20
20
 
21
21
  CONFIG_SCHEMA = cv.All(
22
22
  cv.ensure_list(
23
- {
24
- cv.GenerateID(): cv.declare_id(EspLdo),
25
- cv.Required(CONF_VOLTAGE): cv.All(
26
- cv.voltage, cv.float_range(min=0.5, max=2.7)
27
- ),
28
- cv.Required(CONF_CHANNEL): cv.one_of(*CHANNELS, int=True),
29
- cv.Optional(CONF_ADJUSTABLE, default=False): cv.boolean,
30
- }
23
+ cv.COMPONENT_SCHEMA.extend(
24
+ {
25
+ cv.GenerateID(): cv.declare_id(EspLdo),
26
+ cv.Required(CONF_VOLTAGE): cv.All(
27
+ cv.voltage, cv.float_range(min=0.5, max=2.7)
28
+ ),
29
+ cv.Required(CONF_CHANNEL): cv.one_of(*CHANNELS, int=True),
30
+ cv.Optional(CONF_ADJUSTABLE, default=False): cv.boolean,
31
+ }
32
+ )
31
33
  ),
32
34
  cv.only_with_esp_idf,
33
35
  only_on_variant(supported=[VARIANT_ESP32P4]),
@@ -17,6 +17,9 @@ class EspLdo : public Component {
17
17
  void set_adjustable(bool adjustable) { this->adjustable_ = adjustable; }
18
18
  void set_voltage(float voltage) { this->voltage_ = voltage; }
19
19
  void adjust_voltage(float voltage);
20
+ float get_setup_priority() const override {
21
+ return setup_priority::BUS; // LDO setup should be done early
22
+ }
20
23
 
21
24
  protected:
22
25
  int channel_;
@@ -1,11 +1,16 @@
1
+ import logging
2
+
1
3
  from esphome import pins
2
4
  import esphome.codegen as cg
3
5
  from esphome.components import binary_sensor
4
6
  import esphome.config_validation as cv
5
- from esphome.const import CONF_PIN
7
+ from esphome.const import CONF_ID, CONF_NAME, CONF_NUMBER, CONF_PIN
8
+ from esphome.core import CORE
6
9
 
7
10
  from .. import gpio_ns
8
11
 
12
+ _LOGGER = logging.getLogger(__name__)
13
+
9
14
  GPIOBinarySensor = gpio_ns.class_(
10
15
  "GPIOBinarySensor", binary_sensor.BinarySensor, cg.Component
11
16
  )
@@ -41,6 +46,22 @@ async def to_code(config):
41
46
  pin = await cg.gpio_pin_expression(config[CONF_PIN])
42
47
  cg.add(var.set_pin(pin))
43
48
 
44
- cg.add(var.set_use_interrupt(config[CONF_USE_INTERRUPT]))
45
- if config[CONF_USE_INTERRUPT]:
49
+ # Check for ESP8266 GPIO16 interrupt limitation
50
+ # GPIO16 on ESP8266 is a special pin that doesn't support interrupts through
51
+ # the Arduino attachInterrupt() function. This is the only known GPIO pin
52
+ # across all supported platforms that has this limitation, so we handle it
53
+ # here instead of in the platform-specific code.
54
+ use_interrupt = config[CONF_USE_INTERRUPT]
55
+ if use_interrupt and CORE.is_esp8266 and config[CONF_PIN][CONF_NUMBER] == 16:
56
+ _LOGGER.warning(
57
+ "GPIO binary_sensor '%s': GPIO16 on ESP8266 doesn't support interrupts. "
58
+ "Falling back to polling mode (same as in ESPHome <2025.7). "
59
+ "The sensor will work exactly as before, but other pins have better "
60
+ "performance with interrupts.",
61
+ config.get(CONF_NAME, config[CONF_ID]),
62
+ )
63
+ use_interrupt = False
64
+
65
+ cg.add(var.set_use_interrupt(use_interrupt))
66
+ if use_interrupt:
46
67
  cg.add(var.set_interrupt_type(config[CONF_INTERRUPT_TYPE]))
@@ -180,7 +180,7 @@ async def to_code(config):
180
180
  await speaker.register_speaker(var, config)
181
181
 
182
182
  if config[CONF_DAC_TYPE] == "internal":
183
- cg.add(var.set_internal_dac_mode(config[CONF_CHANNEL]))
183
+ cg.add(var.set_internal_dac_mode(config[CONF_MODE]))
184
184
  else:
185
185
  cg.add(var.set_dout_pin(config[CONF_I2S_DOUT_PIN]))
186
186
  if use_legacy():
@@ -5,10 +5,10 @@
5
5
  namespace esphome {
6
6
  namespace ld2420 {
7
7
 
8
- static const char *const TAG = "LD2420.binary_sensor";
8
+ static const char *const TAG = "ld2420.binary_sensor";
9
9
 
10
10
  void LD2420BinarySensor::dump_config() {
11
- ESP_LOGCONFIG(TAG, "LD2420 BinarySensor:");
11
+ ESP_LOGCONFIG(TAG, "Binary Sensor:");
12
12
  LOG_BINARY_SENSOR(" ", "Presence", this->presence_bsensor_);
13
13
  }
14
14
 
@@ -2,7 +2,7 @@
2
2
  #include "esphome/core/helpers.h"
3
3
  #include "esphome/core/log.h"
4
4
 
5
- static const char *const TAG = "LD2420.button";
5
+ static const char *const TAG = "ld2420.button";
6
6
 
7
7
  namespace esphome {
8
8
  namespace ld2420 {
@@ -137,7 +137,7 @@ static const std::string OP_SIMPLE_MODE_STRING = "Simple";
137
137
  // Memory-efficient lookup tables
138
138
  struct StringToUint8 {
139
139
  const char *str;
140
- uint8_t value;
140
+ const uint8_t value;
141
141
  };
142
142
 
143
143
  static constexpr StringToUint8 OP_MODE_BY_STR[] = {
@@ -155,8 +155,9 @@ static constexpr const char *ERR_MESSAGE[] = {
155
155
  // Helper function for lookups
156
156
  template<size_t N> uint8_t find_uint8(const StringToUint8 (&arr)[N], const std::string &str) {
157
157
  for (const auto &entry : arr) {
158
- if (str == entry.str)
158
+ if (str == entry.str) {
159
159
  return entry.value;
160
+ }
160
161
  }
161
162
  return 0xFF; // Not found
162
163
  }
@@ -326,15 +327,8 @@ void LD2420Component::revert_config_action() {
326
327
 
327
328
  void LD2420Component::loop() {
328
329
  // If there is a active send command do not process it here, the send command call will handle it.
329
- if (!this->get_cmd_active_()) {
330
- if (!this->available())
331
- return;
332
- static uint8_t buffer[2048];
333
- static uint8_t rx_data;
334
- while (this->available()) {
335
- rx_data = this->read();
336
- this->readline_(rx_data, buffer, sizeof(buffer));
337
- }
330
+ while (!this->cmd_active_ && this->available()) {
331
+ this->readline_(this->read(), this->buffer_data_, MAX_LINE_LENGTH);
338
332
  }
339
333
  }
340
334
 
@@ -365,8 +359,9 @@ void LD2420Component::auto_calibrate_sensitivity() {
365
359
 
366
360
  // Store average and peak values
367
361
  this->gate_avg[gate] = sum / CALIBRATE_SAMPLES;
368
- if (this->gate_peak[gate] < peak)
362
+ if (this->gate_peak[gate] < peak) {
369
363
  this->gate_peak[gate] = peak;
364
+ }
370
365
 
371
366
  uint32_t calculated_value =
372
367
  (static_cast<uint32_t>(this->gate_peak[gate]) + (move_factor * static_cast<uint32_t>(this->gate_peak[gate])));
@@ -403,8 +398,9 @@ void LD2420Component::set_operating_mode(const std::string &state) {
403
398
  }
404
399
  } else {
405
400
  // Set the current data back so we don't have new data that can be applied in error.
406
- if (this->get_calibration_())
401
+ if (this->get_calibration_()) {
407
402
  memcpy(&this->new_config, &this->current_config, sizeof(this->current_config));
403
+ }
408
404
  this->set_calibration_(false);
409
405
  }
410
406
  } else {
@@ -414,30 +410,32 @@ void LD2420Component::set_operating_mode(const std::string &state) {
414
410
  }
415
411
 
416
412
  void LD2420Component::readline_(int rx_data, uint8_t *buffer, int len) {
417
- static int pos = 0;
418
-
419
- if (rx_data >= 0) {
420
- if (pos < len - 1) {
421
- buffer[pos++] = rx_data;
422
- buffer[pos] = 0;
423
- } else {
424
- pos = 0;
425
- }
426
- if (pos >= 4) {
427
- if (memcmp(&buffer[pos - 4], &CMD_FRAME_FOOTER, sizeof(CMD_FRAME_FOOTER)) == 0) {
428
- this->set_cmd_active_(false); // Set command state to inactive after responce.
429
- this->handle_ack_data_(buffer, pos);
430
- pos = 0;
431
- } else if ((buffer[pos - 2] == 0x0D && buffer[pos - 1] == 0x0A) &&
432
- (this->get_mode_() == CMD_SYSTEM_MODE_SIMPLE)) {
433
- this->handle_simple_mode_(buffer, pos);
434
- pos = 0;
435
- } else if ((memcmp(&buffer[pos - 4], &ENERGY_FRAME_FOOTER, sizeof(ENERGY_FRAME_FOOTER)) == 0) &&
436
- (this->get_mode_() == CMD_SYSTEM_MODE_ENERGY)) {
437
- this->handle_energy_mode_(buffer, pos);
438
- pos = 0;
439
- }
440
- }
413
+ if (rx_data < 0) {
414
+ return; // No data available
415
+ }
416
+ if (this->buffer_pos_ < len - 1) {
417
+ buffer[this->buffer_pos_++] = rx_data;
418
+ buffer[this->buffer_pos_] = 0;
419
+ } else {
420
+ // We should never get here, but just in case...
421
+ ESP_LOGW(TAG, "Max command length exceeded; ignoring");
422
+ this->buffer_pos_ = 0;
423
+ }
424
+ if (this->buffer_pos_ < 4) {
425
+ return; // Not enough data to process yet
426
+ }
427
+ if (memcmp(&buffer[this->buffer_pos_ - 4], &CMD_FRAME_FOOTER, sizeof(CMD_FRAME_FOOTER)) == 0) {
428
+ this->cmd_active_ = false; // Set command state to inactive after response
429
+ this->handle_ack_data_(buffer, this->buffer_pos_);
430
+ this->buffer_pos_ = 0;
431
+ } else if ((buffer[this->buffer_pos_ - 2] == 0x0D && buffer[this->buffer_pos_ - 1] == 0x0A) &&
432
+ (this->get_mode_() == CMD_SYSTEM_MODE_SIMPLE)) {
433
+ this->handle_simple_mode_(buffer, this->buffer_pos_);
434
+ this->buffer_pos_ = 0;
435
+ } else if ((memcmp(&buffer[this->buffer_pos_ - 4], &ENERGY_FRAME_FOOTER, sizeof(ENERGY_FRAME_FOOTER)) == 0) &&
436
+ (this->get_mode_() == CMD_SYSTEM_MODE_ENERGY)) {
437
+ this->handle_energy_mode_(buffer, this->buffer_pos_);
438
+ this->buffer_pos_ = 0;
441
439
  }
442
440
  }
443
441
 
@@ -462,8 +460,9 @@ void LD2420Component::handle_energy_mode_(uint8_t *buffer, int len) {
462
460
 
463
461
  // Resonable refresh rate for home assistant database size health
464
462
  const int32_t current_millis = App.get_loop_component_start_time();
465
- if (current_millis - this->last_periodic_millis < REFRESH_RATE_MS)
463
+ if (current_millis - this->last_periodic_millis < REFRESH_RATE_MS) {
466
464
  return;
465
+ }
467
466
  this->last_periodic_millis = current_millis;
468
467
  for (auto &listener : this->listeners_) {
469
468
  listener->on_distance(this->get_distance_());
@@ -506,14 +505,16 @@ void LD2420Component::handle_simple_mode_(const uint8_t *inbuf, int len) {
506
505
  }
507
506
  }
508
507
  outbuf[index] = '\0';
509
- if (index > 1)
508
+ if (index > 1) {
510
509
  this->set_distance_(strtol(outbuf, &endptr, 10));
510
+ }
511
511
 
512
512
  if (this->get_mode_() == CMD_SYSTEM_MODE_SIMPLE) {
513
513
  // Resonable refresh rate for home assistant database size health
514
514
  const int32_t current_millis = App.get_loop_component_start_time();
515
- if (current_millis - this->last_normal_periodic_millis < REFRESH_RATE_MS)
515
+ if (current_millis - this->last_normal_periodic_millis < REFRESH_RATE_MS) {
516
516
  return;
517
+ }
517
518
  this->last_normal_periodic_millis = current_millis;
518
519
  for (auto &listener : this->listeners_)
519
520
  listener->on_distance(this->get_distance_());
@@ -593,11 +594,12 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) {
593
594
  int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
594
595
  uint32_t start_millis = millis();
595
596
  uint8_t error = 0;
596
- uint8_t ack_buffer[64];
597
- uint8_t cmd_buffer[64];
597
+ uint8_t ack_buffer[MAX_LINE_LENGTH];
598
+ uint8_t cmd_buffer[MAX_LINE_LENGTH];
598
599
  this->cmd_reply_.ack = false;
599
- if (frame.command != CMD_RESTART)
600
- this->set_cmd_active_(true); // Restart does not reply, thus no ack state required.
600
+ if (frame.command != CMD_RESTART) {
601
+ this->cmd_active_ = true;
602
+ } // Restart does not reply, thus no ack state required
601
603
  uint8_t retry = 3;
602
604
  while (retry) {
603
605
  frame.length = 0;
@@ -619,9 +621,7 @@ int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
619
621
 
620
622
  memcpy(cmd_buffer + frame.length, &frame.footer, sizeof(frame.footer));
621
623
  frame.length += sizeof(frame.footer);
622
- for (uint16_t index = 0; index < frame.length; index++) {
623
- this->write_byte(cmd_buffer[index]);
624
- }
624
+ this->write_array(cmd_buffer, frame.length);
625
625
 
626
626
  error = 0;
627
627
  if (frame.command == CMD_RESTART) {
@@ -630,7 +630,7 @@ int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
630
630
 
631
631
  while (!this->cmd_reply_.ack) {
632
632
  while (this->available()) {
633
- this->readline_(read(), ack_buffer, sizeof(ack_buffer));
633
+ this->readline_(this->read(), ack_buffer, sizeof(ack_buffer));
634
634
  }
635
635
  delay_microseconds_safe(1450);
636
636
  // Wait on an Rx from the LD2420 for up to 3 1 second loops, otherwise it could trigger a WDT.
@@ -641,10 +641,12 @@ int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
641
641
  break;
642
642
  }
643
643
  }
644
- if (this->cmd_reply_.ack)
644
+ if (this->cmd_reply_.ack) {
645
645
  retry = 0;
646
- if (this->cmd_reply_.error > 0)
646
+ }
647
+ if (this->cmd_reply_.error > 0) {
647
648
  this->handle_cmd_error(error);
649
+ }
648
650
  }
649
651
  return error;
650
652
  }
@@ -764,8 +766,9 @@ void LD2420Component::set_system_mode(uint16_t mode) {
764
766
  cmd_frame.data_length += sizeof(unknown_parm);
765
767
  cmd_frame.footer = CMD_FRAME_FOOTER;
766
768
  ESP_LOGV(TAG, "Sending write system mode command: %2X", cmd_frame.command);
767
- if (this->send_cmd_from_array(cmd_frame) == 0)
769
+ if (this->send_cmd_from_array(cmd_frame) == 0) {
768
770
  this->set_mode_(mode);
771
+ }
769
772
  }
770
773
 
771
774
  void LD2420Component::get_firmware_version_() {
@@ -840,18 +843,24 @@ void LD2420Component::set_gate_threshold(uint8_t gate) {
840
843
 
841
844
  #ifdef USE_NUMBER
842
845
  void LD2420Component::init_gate_config_numbers() {
843
- if (this->gate_timeout_number_ != nullptr)
846
+ if (this->gate_timeout_number_ != nullptr) {
844
847
  this->gate_timeout_number_->publish_state(static_cast<uint16_t>(this->current_config.timeout));
845
- if (this->gate_select_number_ != nullptr)
848
+ }
849
+ if (this->gate_select_number_ != nullptr) {
846
850
  this->gate_select_number_->publish_state(0);
847
- if (this->min_gate_distance_number_ != nullptr)
851
+ }
852
+ if (this->min_gate_distance_number_ != nullptr) {
848
853
  this->min_gate_distance_number_->publish_state(static_cast<uint16_t>(this->current_config.min_gate));
849
- if (this->max_gate_distance_number_ != nullptr)
854
+ }
855
+ if (this->max_gate_distance_number_ != nullptr) {
850
856
  this->max_gate_distance_number_->publish_state(static_cast<uint16_t>(this->current_config.max_gate));
851
- if (this->gate_move_sensitivity_factor_number_ != nullptr)
857
+ }
858
+ if (this->gate_move_sensitivity_factor_number_ != nullptr) {
852
859
  this->gate_move_sensitivity_factor_number_->publish_state(this->gate_move_sensitivity_factor);
853
- if (this->gate_still_sensitivity_factor_number_ != nullptr)
860
+ }
861
+ if (this->gate_still_sensitivity_factor_number_ != nullptr) {
854
862
  this->gate_still_sensitivity_factor_number_->publish_state(this->gate_still_sensitivity_factor);
863
+ }
855
864
  for (uint8_t gate = 0; gate < TOTAL_GATES; gate++) {
856
865
  if (this->gate_still_threshold_numbers_[gate] != nullptr) {
857
866
  this->gate_still_threshold_numbers_[gate]->publish_state(
@@ -20,8 +20,9 @@
20
20
  namespace esphome {
21
21
  namespace ld2420 {
22
22
 
23
- static const uint8_t TOTAL_GATES = 16;
24
23
  static const uint8_t CALIBRATE_SAMPLES = 64;
24
+ static const uint8_t MAX_LINE_LENGTH = 46; // Max characters for serial buffer
25
+ static const uint8_t TOTAL_GATES = 16;
25
26
 
26
27
  enum OpMode : uint8_t {
27
28
  OP_NORMAL_MODE = 1,
@@ -118,10 +119,10 @@ class LD2420Component : public Component, public uart::UARTDevice {
118
119
 
119
120
  float gate_move_sensitivity_factor{0.5};
120
121
  float gate_still_sensitivity_factor{0.5};
121
- int32_t last_periodic_millis = millis();
122
- int32_t report_periodic_millis = millis();
123
- int32_t monitor_periodic_millis = millis();
124
- int32_t last_normal_periodic_millis = millis();
122
+ int32_t last_periodic_millis{0};
123
+ int32_t report_periodic_millis{0};
124
+ int32_t monitor_periodic_millis{0};
125
+ int32_t last_normal_periodic_millis{0};
125
126
  uint16_t radar_data[TOTAL_GATES][CALIBRATE_SAMPLES];
126
127
  uint16_t gate_avg[TOTAL_GATES];
127
128
  uint16_t gate_peak[TOTAL_GATES];
@@ -161,8 +162,6 @@ class LD2420Component : public Component, public uart::UARTDevice {
161
162
  void set_presence_(bool presence) { this->presence_ = presence; };
162
163
  uint16_t get_distance_() { return this->distance_; };
163
164
  void set_distance_(uint16_t distance) { this->distance_ = distance; };
164
- bool get_cmd_active_() { return this->cmd_active_; };
165
- void set_cmd_active_(bool active) { this->cmd_active_ = active; };
166
165
  void handle_simple_mode_(const uint8_t *inbuf, int len);
167
166
  void handle_energy_mode_(uint8_t *buffer, int len);
168
167
  void handle_ack_data_(uint8_t *buffer, int len);
@@ -181,12 +180,11 @@ class LD2420Component : public Component, public uart::UARTDevice {
181
180
  std::vector<number::Number *> gate_move_threshold_numbers_ = std::vector<number::Number *>(16);
182
181
  #endif
183
182
 
184
- uint32_t max_distance_gate_;
185
- uint32_t min_distance_gate_;
183
+ uint16_t distance_{0};
186
184
  uint16_t system_mode_;
187
185
  uint16_t gate_energy_[TOTAL_GATES];
188
- uint16_t distance_{0};
189
- uint8_t config_checksum_{0};
186
+ uint8_t buffer_pos_{0}; // where to resume processing/populating buffer
187
+ uint8_t buffer_data_[MAX_LINE_LENGTH];
190
188
  char firmware_ver_[8]{"v0.0.0"};
191
189
  bool cmd_active_{false};
192
190
  bool presence_{false};
@@ -2,7 +2,7 @@
2
2
  #include "esphome/core/helpers.h"
3
3
  #include "esphome/core/log.h"
4
4
 
5
- static const char *const TAG = "LD2420.number";
5
+ static const char *const TAG = "ld2420.number";
6
6
 
7
7
  namespace esphome {
8
8
  namespace ld2420 {
@@ -5,7 +5,7 @@
5
5
  namespace esphome {
6
6
  namespace ld2420 {
7
7
 
8
- static const char *const TAG = "LD2420.select";
8
+ static const char *const TAG = "ld2420.select";
9
9
 
10
10
  void LD2420Select::control(const std::string &value) {
11
11
  this->publish_state(value);
@@ -5,10 +5,10 @@
5
5
  namespace esphome {
6
6
  namespace ld2420 {
7
7
 
8
- static const char *const TAG = "LD2420.sensor";
8
+ static const char *const TAG = "ld2420.sensor";
9
9
 
10
10
  void LD2420Sensor::dump_config() {
11
- ESP_LOGCONFIG(TAG, "LD2420 Sensor:");
11
+ ESP_LOGCONFIG(TAG, "Sensor:");
12
12
  LOG_SENSOR(" ", "Distance", this->distance_sensor_);
13
13
  }
14
14
 
@@ -5,10 +5,10 @@
5
5
  namespace esphome {
6
6
  namespace ld2420 {
7
7
 
8
- static const char *const TAG = "LD2420.text_sensor";
8
+ static const char *const TAG = "ld2420.text_sensor";
9
9
 
10
10
  void LD2420TextSensor::dump_config() {
11
- ESP_LOGCONFIG(TAG, "LD2420 TextSensor:");
11
+ ESP_LOGCONFIG(TAG, "Text Sensor:");
12
12
  LOG_TEXT_SENSOR(" ", "Firmware", this->fw_version_text_sensor_);
13
13
  }
14
14
 
@@ -29,9 +29,9 @@ from ..defines import (
29
29
  )
30
30
  from ..helpers import add_lv_use, lvgl_components_required
31
31
  from ..lv_validation import (
32
- angle,
33
32
  get_end_value,
34
33
  get_start_value,
34
+ lv_angle,
35
35
  lv_bool,
36
36
  lv_color,
37
37
  lv_float,
@@ -162,7 +162,7 @@ SCALE_SCHEMA = cv.Schema(
162
162
  cv.Optional(CONF_RANGE_FROM, default=0.0): cv.float_,
163
163
  cv.Optional(CONF_RANGE_TO, default=100.0): cv.float_,
164
164
  cv.Optional(CONF_ANGLE_RANGE, default=270): cv.int_range(0, 360),
165
- cv.Optional(CONF_ROTATION): angle,
165
+ cv.Optional(CONF_ROTATION): lv_angle,
166
166
  cv.Optional(CONF_INDICATORS): cv.ensure_list(INDICATOR_SCHEMA),
167
167
  }
168
168
  )
@@ -187,7 +187,7 @@ class MeterType(WidgetType):
187
187
  for scale_conf in config.get(CONF_SCALES, ()):
188
188
  rotation = 90 + (360 - scale_conf[CONF_ANGLE_RANGE]) / 2
189
189
  if CONF_ROTATION in scale_conf:
190
- rotation = scale_conf[CONF_ROTATION] // 10
190
+ rotation = await lv_angle.process(scale_conf[CONF_ROTATION])
191
191
  with LocalVariable(
192
192
  "meter_var", "lv_meter_scale_t", lv_expr.meter_add_scale(var)
193
193
  ) as meter_var:
@@ -205,21 +205,20 @@ class MeterType(WidgetType):
205
205
  var,
206
206
  meter_var,
207
207
  ticks[CONF_COUNT],
208
- ticks[CONF_WIDTH],
209
- ticks[CONF_LENGTH],
208
+ await size.process(ticks[CONF_WIDTH]),
209
+ await size.process(ticks[CONF_LENGTH]),
210
210
  color,
211
211
  )
212
212
  if CONF_MAJOR in ticks:
213
213
  major = ticks[CONF_MAJOR]
214
- color = await lv_color.process(major[CONF_COLOR])
215
214
  lv.meter_set_scale_major_ticks(
216
215
  var,
217
216
  meter_var,
218
217
  major[CONF_STRIDE],
219
- major[CONF_WIDTH],
220
- major[CONF_LENGTH],
221
- color,
222
- major[CONF_LABEL_GAP],
218
+ await size.process(major[CONF_WIDTH]),
219
+ await size.process(major[CONF_LENGTH]),
220
+ await lv_color.process(major[CONF_COLOR]),
221
+ await size.process(major[CONF_LABEL_GAP]),
223
222
  )
224
223
  for indicator in scale_conf.get(CONF_INDICATORS, ()):
225
224
  (t, v) = next(iter(indicator.items()))
@@ -233,7 +232,11 @@ class MeterType(WidgetType):
233
232
  lv_assign(
234
233
  ivar,
235
234
  lv_expr.meter_add_needle_line(
236
- var, meter_var, v[CONF_WIDTH], color, v[CONF_R_MOD]
235
+ var,
236
+ meter_var,
237
+ await size.process(v[CONF_WIDTH]),
238
+ color,
239
+ await size.process(v[CONF_R_MOD]),
237
240
  ),
238
241
  )
239
242
  if t == CONF_ARC:
@@ -241,7 +244,11 @@ class MeterType(WidgetType):
241
244
  lv_assign(
242
245
  ivar,
243
246
  lv_expr.meter_add_arc(
244
- var, meter_var, v[CONF_WIDTH], color, v[CONF_R_MOD]
247
+ var,
248
+ meter_var,
249
+ await size.process(v[CONF_WIDTH]),
250
+ color,
251
+ await size.process(v[CONF_R_MOD]),
245
252
  ),
246
253
  )
247
254
  if t == CONF_TICK_STYLE:
@@ -257,7 +264,7 @@ class MeterType(WidgetType):
257
264
  color_start,
258
265
  color_end,
259
266
  v[CONF_LOCAL],
260
- v[CONF_WIDTH],
267
+ size.process(v[CONF_WIDTH]),
261
268
  ),
262
269
  )
263
270
  if t == CONF_IMAGE:
@@ -151,8 +151,11 @@ def _substitute_item(substitutions, item, path, jinja, ignore_missing):
151
151
  if sub is not None:
152
152
  item[k] = sub
153
153
  for old, new in replace_keys:
154
- item[new] = merge_config(item.get(old), item.get(new))
155
- del item[old]
154
+ if str(new) == str(old):
155
+ item[new] = item[old]
156
+ else:
157
+ item[new] = merge_config(item.get(old), item.get(new))
158
+ del item[old]
156
159
  elif isinstance(item, str):
157
160
  sub = _expand_substitutions(substitutions, item, path, jinja, ignore_missing)
158
161
  if isinstance(sub, JinjaStr) or sub != item:
esphome/const.py CHANGED
@@ -4,7 +4,7 @@ from enum import Enum
4
4
 
5
5
  from esphome.enum import StrEnum
6
6
 
7
- __version__ = "2025.7.0b2"
7
+ __version__ = "2025.7.0b3"
8
8
 
9
9
  ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
10
10
  VALID_SUBSTITUTIONS_CHARACTERS = (
@@ -138,7 +138,7 @@ void Component::call_dump_config() {
138
138
  }
139
139
  }
140
140
  }
141
- ESP_LOGE(TAG, " Component %s is marked FAILED: %s", this->get_component_source(), error_msg);
141
+ ESP_LOGE(TAG, " %s is marked FAILED: %s", this->get_component_source(), error_msg);
142
142
  }
143
143
  }
144
144
 
@@ -191,7 +191,7 @@ bool Component::should_warn_of_blocking(uint32_t blocking_time) {
191
191
  return false;
192
192
  }
193
193
  void Component::mark_failed() {
194
- ESP_LOGE(TAG, "Component %s was marked as failed", this->get_component_source());
194
+ ESP_LOGE(TAG, "%s was marked as failed", this->get_component_source());
195
195
  this->component_state_ &= ~COMPONENT_STATE_MASK;
196
196
  this->component_state_ |= COMPONENT_STATE_FAILED;
197
197
  this->status_set_error();
@@ -229,7 +229,7 @@ void IRAM_ATTR HOT Component::enable_loop_soon_any_context() {
229
229
  }
230
230
  void Component::reset_to_construction_state() {
231
231
  if ((this->component_state_ & COMPONENT_STATE_MASK) == COMPONENT_STATE_FAILED) {
232
- ESP_LOGI(TAG, "Component %s is being reset to construction state", this->get_component_source());
232
+ ESP_LOGI(TAG, "%s is being reset to construction state", this->get_component_source());
233
233
  this->component_state_ &= ~COMPONENT_STATE_MASK;
234
234
  this->component_state_ |= COMPONENT_STATE_CONSTRUCTION;
235
235
  // Clear error status when resetting
@@ -275,14 +275,14 @@ void Component::status_set_warning(const char *message) {
275
275
  return;
276
276
  this->component_state_ |= STATUS_LED_WARNING;
277
277
  App.app_state_ |= STATUS_LED_WARNING;
278
- ESP_LOGW(TAG, "Component %s set Warning flag: %s", this->get_component_source(), message);
278
+ ESP_LOGW(TAG, "%s set Warning flag: %s", this->get_component_source(), message);
279
279
  }
280
280
  void Component::status_set_error(const char *message) {
281
281
  if ((this->component_state_ & STATUS_LED_ERROR) != 0)
282
282
  return;
283
283
  this->component_state_ |= STATUS_LED_ERROR;
284
284
  App.app_state_ |= STATUS_LED_ERROR;
285
- ESP_LOGE(TAG, "Component %s set Error flag: %s", this->get_component_source(), message);
285
+ ESP_LOGE(TAG, "%s set Error flag: %s", this->get_component_source(), message);
286
286
  if (strcmp(message, "unspecified") != 0) {
287
287
  // Lazy allocate the error messages vector if needed
288
288
  if (!component_error_messages) {
@@ -303,13 +303,13 @@ void Component::status_clear_warning() {
303
303
  if ((this->component_state_ & STATUS_LED_WARNING) == 0)
304
304
  return;
305
305
  this->component_state_ &= ~STATUS_LED_WARNING;
306
- ESP_LOGW(TAG, "Component %s cleared Warning flag", this->get_component_source());
306
+ ESP_LOGW(TAG, "%s cleared Warning flag", this->get_component_source());
307
307
  }
308
308
  void Component::status_clear_error() {
309
309
  if ((this->component_state_ & STATUS_LED_ERROR) == 0)
310
310
  return;
311
311
  this->component_state_ &= ~STATUS_LED_ERROR;
312
- ESP_LOGE(TAG, "Component %s cleared Error flag", this->get_component_source());
312
+ ESP_LOGE(TAG, "%s cleared Error flag", this->get_component_source());
313
313
  }
314
314
  void Component::status_momentary_warning(const std::string &name, uint32_t length) {
315
315
  this->status_set_warning();
@@ -403,7 +403,7 @@ uint32_t WarnIfComponentBlockingGuard::finish() {
403
403
  }
404
404
  if (should_warn) {
405
405
  const char *src = component_ == nullptr ? "<null>" : component_->get_component_source();
406
- ESP_LOGW(TAG, "Component %s took a long time for an operation (%" PRIu32 " ms)", src, blocking_time);
406
+ ESP_LOGW(TAG, "%s took a long time for an operation (%" PRIu32 " ms)", src, blocking_time);
407
407
  ESP_LOGW(TAG, "Components should block for at most 30 ms");
408
408
  }
409
409
 
esphome/core/helpers.h CHANGED
@@ -783,7 +783,7 @@ template<class T> class RAMAllocator {
783
783
  T *reallocate(T *p, size_t n) { return this->reallocate(p, n, sizeof(T)); }
784
784
 
785
785
  T *reallocate(T *p, size_t n, size_t manual_size) {
786
- size_t size = n * sizeof(T);
786
+ size_t size = n * manual_size;
787
787
  T *ptr = nullptr;
788
788
  #ifdef USE_ESP32
789
789
  if (this->flags_ & Flags::ALLOC_EXTERNAL) {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: esphome
3
- Version: 2025.7.0b2
3
+ Version: 2025.7.0b3
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=ZZdWJJD7E7BwSpvgVvDerIAGpvGB4G57JSbkZCySH5w,43369
8
+ esphome/const.py,sha256=9UDpVL3euqlC_YJOtTLYHs4MpUCqRjI8hMV_71Asw8M,43369
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
@@ -933,9 +933,9 @@ esphome/components/esp8266_pwm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5
933
933
  esphome/components/esp8266_pwm/esp8266_pwm.cpp,sha256=C6eQ2S2mgwDgeb-v1lqb81Ht462bQ8L7jyia6d9CC88,1684
934
934
  esphome/components/esp8266_pwm/esp8266_pwm.h,sha256=YLObIixl3YFDx3biu1TVfH6qyOFFts-VGT4pxgN0PHw,1386
935
935
  esphome/components/esp8266_pwm/output.py,sha256=s5sMTbATthPAJCJyTwvIBYQAoEcffAGxBvv7NLwtkZY,2041
936
- esphome/components/esp_ldo/__init__.py,sha256=Udu2rZOuQ3GYCS68THjsG6TUAtK1FT4mx4kxzKwLB5o,2814
936
+ esphome/components/esp_ldo/__init__.py,sha256=bBEaDXgqzFtcRSOcUttuA8VGJnayYjLU-zhvzGw8UiU,2892
937
937
  esphome/components/esp_ldo/esp_ldo.cpp,sha256=cAnIUUnO9EGLEx2y0cZ7eT5eVeollwTxFLGQUdZ9sP8,1506
938
- esphome/components/esp_ldo/esp_ldo.h,sha256=KwHiF_2jhRJLj6Rk5V1jJ4xVPG_yD54qgkla81vy4IQ,1013
938
+ esphome/components/esp_ldo/esp_ldo.h,sha256=M5pLF6Wv1_CasrOHDG9e6UIYD-7KNVbZtXk0uAt61Bc,1130
939
939
  esphome/components/esphome/ota/__init__.py,sha256=KKXGpESL_RUHYUWqEZ_VPXnfJX5So8q7FX2E2A4hc4E,4880
940
940
  esphome/components/esphome/ota/ota_esphome.cpp,sha256=nj1hd4fkGvKq95NYqhE9faG0pYJxeE1gLcmu-KBdwW8,12968
941
941
  esphome/components/esphome/ota/ota_esphome.h,sha256=MHd6DPavp08gfb-bcttjCiv3U60XMSTMDi2nPcN8Y7s,1140
@@ -1044,7 +1044,7 @@ esphome/components/gp8403/output/__init__.py,sha256=3VX9AD0N0SRXdOfKJcMMgjCwA1-R
1044
1044
  esphome/components/gp8403/output/gp8403_output.cpp,sha256=FQPUa_ZMgLz7LNHy6N8sNUpnI2hwOIZTRrwWtjXrbGs,714
1045
1045
  esphome/components/gp8403/output/gp8403_output.h,sha256=wJd_-CtUSxw5ujhR21E1zCiB9hvpl3Ktt665D3iQLf4,598
1046
1046
  esphome/components/gpio/__init__.py,sha256=afIFpPG_fsom-8vYV1yRyvhSCFyASlAdraUCuztWQZ4,103
1047
- esphome/components/gpio/binary_sensor/__init__.py,sha256=PMP1TpB1YtHB55RpkHOCVBZ3CTSxqfQj9CoPjjRD4cg,1327
1047
+ esphome/components/gpio/binary_sensor/__init__.py,sha256=_rb3IP-gt1Fq5wSoFG36L7YATLF4xX2dRNlDI9sM1kU,2295
1048
1048
  esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp,sha256=wVa5pNQMnUOO9RUovnf6G8MYQtKQoRSojA3MItHLnbg,3131
1049
1049
  esphome/components/gpio/binary_sensor/gpio_binary_sensor.h,sha256=ukwmyxJhiYXMczcT16zwdliTX5Brf8fdgDzid6l13wE,2000
1050
1050
  esphome/components/gpio/one_wire/__init__.py,sha256=oH6-6zy18pG_7iqzLegjh4AbjnbZHqBRZKHdHBI-828,714
@@ -1285,7 +1285,7 @@ esphome/components/i2s_audio/media_player/i2s_audio_media_player.h,sha256=gmG6n9
1285
1285
  esphome/components/i2s_audio/microphone/__init__.py,sha256=m62jL72XwxBavk9cDULs2cdcbHHkM96JF5RPiPBHGcg,4281
1286
1286
  esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp,sha256=TUsYopCDgzRWi4QRtw3hNx5qmsy4eT8hUnEeUvFyiA4,16932
1287
1287
  esphome/components/i2s_audio/microphone/i2s_audio_microphone.h,sha256=74azu9ZjuKfbE5tPXIMDMQD241EqYU1VtV8gpwfLtHw,2409
1288
- esphome/components/i2s_audio/speaker/__init__.py,sha256=EUWTtCtc3T5zoaHMUnqu-KjJh5nnwKrkUAQi3QYEDi0,6152
1288
+ esphome/components/i2s_audio/speaker/__init__.py,sha256=GqE7dlAd6cbn0Es_ZRWpLZhMG0UQrPmwABPfkdF1I_g,6149
1289
1289
  esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp,sha256=WWsZ72wenICP37UHodPgT7_ui_SHKLsBKAff4RuCu2M,27353
1290
1290
  esphome/components/i2s_audio/speaker/i2s_audio_speaker.h,sha256=JZLm5X2Anpx4R34eXONlHvzypJvLI8N-MQiZkFhx7B4,6697
1291
1291
  esphome/components/iaqcore/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1433,25 +1433,25 @@ esphome/components/ld2410/switch/bluetooth_switch.h,sha256=B-oPEG1KV23aATKLLRqqt
1433
1433
  esphome/components/ld2410/switch/engineering_mode_switch.cpp,sha256=DtyDtB0m9xyiEjfrKCg_z0aUVlexvS2t6EdkZ_j1S4Q,258
1434
1434
  esphome/components/ld2410/switch/engineering_mode_switch.h,sha256=YtfYVHHSWRic0qg9iei16S52urpQHAeUMddDXon2EII,364
1435
1435
  esphome/components/ld2420/__init__.py,sha256=iei6OBPy_GV2tvLBsK5y3BaLxGOkqPypozfNw4BfVLY,898
1436
- esphome/components/ld2420/ld2420.cpp,sha256=R86OORcqKuV42yt00kn5LTBUCbF98MIXiO7F9FUatBY,35505
1437
- esphome/components/ld2420/ld2420.h,sha256=sTfqvMyrIjGS1An44MoCaDMX73GxmkaGtjYvajtpCWQ,7659
1436
+ esphome/components/ld2420/ld2420.cpp,sha256=gGtUOfbXuLfhiiAC5BDgAsnEQ6AQpXOJbvAuiZm-510,35757
1437
+ esphome/components/ld2420/ld2420.h,sha256=PDPHjm8gujPdiXyFj2PrqzmxlskuJyupyaAVysCVEJY,7605
1438
1438
  esphome/components/ld2420/binary_sensor/__init__.py,sha256=dAItkJvREF_uaoUAwL_XZd8OpKDzFVh4IWSW6gGHY_I,1100
1439
- esphome/components/ld2420/binary_sensor/ld2420_binary_sensor.cpp,sha256=c-uJCQ2TMZmTrmMlzy0KBVaAJlaykmfVxkysBPXGcl8,396
1439
+ esphome/components/ld2420/binary_sensor/ld2420_binary_sensor.cpp,sha256=hXrHfEkW0R4hOBnO4sf2NGJMpqbCLTrqcW0WR0__oNo,390
1440
1440
  esphome/components/ld2420/binary_sensor/ld2420_binary_sensor.h,sha256=5xaOuNN3ewvyTyZW4eBi7G4kE9gLxPqsY3xbEibXRyQ,717
1441
1441
  esphome/components/ld2420/button/__init__.py,sha256=vQgQJV2bMSXvGVP7UHP32CTfPpSbnYpdox_BlNnIdJE,2728
1442
- esphome/components/ld2420/button/reconfig_buttons.cpp,sha256=gBPxLPsaT6SnZwzPDmbwHOPs9ZEHez2WwBaBYVwFyt8,588
1442
+ esphome/components/ld2420/button/reconfig_buttons.cpp,sha256=X0mRuVq941A6j0AhNLVecElTKO86fzoHZ-YbP2bnarU,588
1443
1443
  esphome/components/ld2420/button/reconfig_buttons.h,sha256=g7sUKrlQKMAXdngXnEWs6MkNPdTjdAuSa3KT9komxNQ,927
1444
1444
  esphome/components/ld2420/number/__init__.py,sha256=Cc9MjrqowggJB6dxTptzy65rh65zWYbvFZUtm0Gcu9g,7961
1445
- esphome/components/ld2420/number/gate_config_number.cpp,sha256=zuhkGl0KrIYGW6QCUuT_iFKvhdUqHiD9vvfF46Iq9AE,2392
1445
+ esphome/components/ld2420/number/gate_config_number.cpp,sha256=0a9KtptLjDRnAwGsbgGyt7l9bxq61zmqm71q1cJIcGU,2392
1446
1446
  esphome/components/ld2420/number/gate_config_number.h,sha256=sYuklfUnQwoHsrcfzonabw9f0xfPmxyv4KrfdptqyKE,1902
1447
1447
  esphome/components/ld2420/select/__init__.py,sha256=2e2h1F-5xUYt4ADkLgQxFsOJ1u6Xym0j1tXIhTTmF68,1013
1448
- esphome/components/ld2420/select/operating_mode_select.cpp,sha256=f_j93QQtK7drD4Z1ds2QLAIqLB1M-kuSaoC1qnbvvGs,368
1448
+ esphome/components/ld2420/select/operating_mode_select.cpp,sha256=gfBUYCYp8GqoMcHW5ttIfYSHaYOKonS-akxQCKtC_iM,368
1449
1449
  esphome/components/ld2420/select/operating_mode_select.h,sha256=YW2eqa9Ga6AC4-xk7UdcaMkkapQ3EVlzgdyGyKVg8zI,373
1450
1450
  esphome/components/ld2420/sensor/__init__.py,sha256=O312BKb_LMxJM2IQDeCSHoGBfmmZ5zWUmiNWQXudE_g,1298
1451
- esphome/components/ld2420/sensor/ld2420_sensor.cpp,sha256=klt-v1jhygSGbHXPgGgMIeZ7-NTDun9VgIOX2CLh2J4,362
1451
+ esphome/components/ld2420/sensor/ld2420_sensor.cpp,sha256=0nkkrkvMJT2srNQ2JGGoOIOzT5p9VIka0n_Iv2NVF1U,355
1452
1452
  esphome/components/ld2420/sensor/ld2420_sensor.h,sha256=wwS-YQmlrVFCtwshXKy3FTd16RLlx8_Qe-6j4tISXMI,1030
1453
1453
  esphome/components/ld2420/text_sensor/__init__.py,sha256=3tURtfeJvPyYSn0qsb8ynmDx_Z0KCEXaq3VqZ8aKWY0,1139
1454
- esphome/components/ld2420/text_sensor/text_sensor.cpp,sha256=T8Hlo3rGbyEpKMlFHTfjMMZIueh_Xac5GfAWnOZ-IMk,385
1454
+ esphome/components/ld2420/text_sensor/text_sensor.cpp,sha256=6rvT1dp3u9Fpmpm-3kHZTBnGZ8omsUABTM9jkey0-IA,379
1455
1455
  esphome/components/ld2420/text_sensor/text_sensor.h,sha256=aK91ri0NvHth3ya0zN1OeX81v1nqveoiJcOfqCpaAJI,672
1456
1456
  esphome/components/ld2450/__init__.py,sha256=n6KvEkMsoaR3DUix1a1MGq-ZyjAAIAKDZ0lYN7iKSpQ,1267
1457
1457
  esphome/components/ld2450/binary_sensor.py,sha256=SyIw9c-4JqNm8JKuzSKA9rVWaVCGsYAslV0VbhqJnoM,1755
@@ -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=I_BSID9CNbHSX1xhQJVtvjHSu3oLn1ftyESJ0rKhfwY,11082
1631
+ esphome/components/lvgl/widgets/meter.py,sha256=ptMHG6LCky1jwtUcGODek0W94Ju9PWGPbkg91l3NyKA,11520
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
@@ -2944,7 +2944,7 @@ esphome/components/sts3x/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
2944
2944
  esphome/components/sts3x/sensor.py,sha256=L3KzexM-oB7ZYLkyfuL2tGcr374xbMEtgh4qCC-O6RA,921
2945
2945
  esphome/components/sts3x/sts3x.cpp,sha256=61I1NYl4UYc6H2LF3FCB9QJ_JV9QRFgIDXAWDuNxK7E,2080
2946
2946
  esphome/components/sts3x/sts3x.h,sha256=MDc_-wFonrh4r4FKwm4OYT5nZiTDZKO0-gmadE-cvjA,610
2947
- esphome/components/substitutions/__init__.py,sha256=3Wzxf3Hdi7qbe9oK-rk5aZj2SbMr_2gLEGpPWcEd8YM,7113
2947
+ esphome/components/substitutions/__init__.py,sha256=jTAm7n58NxQAfzszdlOfOIQXpAAexQ8oVHnq2Xl_NIU,7214
2948
2948
  esphome/components/substitutions/jinja.py,sha256=knHsEQPpo2UqNS5r65CiqULoVrGp8lw3XY1_DrDzwO0,3793
2949
2949
  esphome/components/sun/__init__.py,sha256=52Yrvmk4zJpfX3NdSaCsg3ZxXOCmY4W5cR7F5zbOzhs,5327
2950
2950
  esphome/components/sun/sun.cpp,sha256=YEe2SsF4OEmK27NQRZ0tYBv_n5vnJd-6HA45GDTxqa8,11874
@@ -3600,7 +3600,7 @@ esphome/core/automation.h,sha256=UgoI-ebaL5YJ_cyRB-3ijHQxzt4cTbTaWw4eRGoOwBI,862
3600
3600
  esphome/core/base_automation.h,sha256=wAJu_yy1tDjwARdCZ312t7anzR9dBF_54qiXm1sy-_g,11216
3601
3601
  esphome/core/color.cpp,sha256=gcFk-FTJzvrePzqgA5gvsXv8iWct0ykdVGx_ivrilR0,254
3602
3602
  esphome/core/color.h,sha256=K2iTTKgOgXcCm61S1f2P_k7YheKP654gUubWq5X0FhE,6647
3603
- esphome/core/component.cpp,sha256=-25rWUKjBdhkf7mbkhDyJql7JesZKr4DrfBOCEh3tSQ,16802
3603
+ esphome/core/component.cpp,sha256=HooDcPKuf7AzdOJuUAB72ecKCMqWUNGH5Z9qVVeE1OA,16722
3604
3604
  esphome/core/component.h,sha256=Z1TYaQDGkoddm75zaPTQc_C0STpCCl200oDZsoc6yAk,17985
3605
3605
  esphome/core/component_iterator.cpp,sha256=VD_bSv474jQlKctKIzYSPUK8zpm01PJ1Fymix1c92Jg,11121
3606
3606
  esphome/core/component_iterator.h,sha256=-j9hGIY8mCmgq2nLuoG_IFY0lSoHkImXMEVtUKYpngA,3791
@@ -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=lWx3WHDuoIQVsrsXnYeawJJbchG5SJb4BIJHlvL6jRA,33360
3621
+ esphome/core/helpers.h,sha256=jhoCkhTlwqSVOXVNWK7RnIXgJQiu9QvbsZV-WmPWOTY,33362
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.0b2.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3659
- esphome-2025.7.0b2.dist-info/METADATA,sha256=BlTTcBCTTdohaEPcEGQoGolJbebFFYm2EJncogIWCLw,3707
3660
- esphome-2025.7.0b2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
3661
- esphome-2025.7.0b2.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3662
- esphome-2025.7.0b2.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3663
- esphome-2025.7.0b2.dist-info/RECORD,,
3658
+ esphome-2025.7.0b3.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3659
+ esphome-2025.7.0b3.dist-info/METADATA,sha256=W0Ip6b7lVsdNwuH3YrV7gqVmt36KiktFKGIoFas9w6I,3707
3660
+ esphome-2025.7.0b3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
3661
+ esphome-2025.7.0b3.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3662
+ esphome-2025.7.0b3.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3663
+ esphome-2025.7.0b3.dist-info/RECORD,,