esphome 2025.2.0b2__py3-none-any.whl → 2025.2.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.
@@ -7,13 +7,16 @@
7
7
  #ifdef USE_ARDUINO
8
8
  #include <esp32-hal-dac.h>
9
9
  #endif
10
- #ifdef USE_ESP_IDF
11
- #include <driver/dac.h>
12
- #endif
13
10
 
14
11
  namespace esphome {
15
12
  namespace esp32_dac {
16
13
 
14
+ #ifdef USE_ESP32_VARIANT_ESP32S2
15
+ static constexpr uint8_t DAC0_PIN = 17;
16
+ #else
17
+ static constexpr uint8_t DAC0_PIN = 25;
18
+ #endif
19
+
17
20
  static const char *const TAG = "esp32_dac";
18
21
 
19
22
  void ESP32DAC::setup() {
@@ -22,8 +25,15 @@ void ESP32DAC::setup() {
22
25
  this->turn_off();
23
26
 
24
27
  #ifdef USE_ESP_IDF
25
- auto channel = pin_->get_pin() == 25 ? DAC_CHANNEL_1 : DAC_CHANNEL_2;
26
- dac_output_enable(channel);
28
+ const dac_channel_t channel = this->pin_->get_pin() == DAC0_PIN ? DAC_CHAN_0 : DAC_CHAN_1;
29
+ const dac_oneshot_config_t oneshot_cfg{channel};
30
+ dac_oneshot_new_channel(&oneshot_cfg, &this->dac_handle_);
31
+ #endif
32
+ }
33
+
34
+ void ESP32DAC::on_safe_shutdown() {
35
+ #ifdef USE_ESP_IDF
36
+ dac_oneshot_del_channel(this->dac_handle_);
27
37
  #endif
28
38
  }
29
39
 
@@ -40,8 +50,7 @@ void ESP32DAC::write_state(float state) {
40
50
  state = state * 255;
41
51
 
42
52
  #ifdef USE_ESP_IDF
43
- auto channel = pin_->get_pin() == 25 ? DAC_CHANNEL_1 : DAC_CHANNEL_2;
44
- dac_output_voltage(channel, (uint8_t) state);
53
+ dac_oneshot_output_voltage(this->dac_handle_, state);
45
54
  #endif
46
55
  #ifdef USE_ARDUINO
47
56
  dacWrite(this->pin_->get_pin(), state);
@@ -7,6 +7,10 @@
7
7
 
8
8
  #ifdef USE_ESP32
9
9
 
10
+ #ifdef USE_ESP_IDF
11
+ #include <driver/dac_oneshot.h>
12
+ #endif
13
+
10
14
  namespace esphome {
11
15
  namespace esp32_dac {
12
16
 
@@ -16,6 +20,7 @@ class ESP32DAC : public output::FloatOutput, public Component {
16
20
 
17
21
  /// Initialize pin
18
22
  void setup() override;
23
+ void on_safe_shutdown() override;
19
24
  void dump_config() override;
20
25
  /// HARDWARE setup_priority
21
26
  float get_setup_priority() const override { return setup_priority::HARDWARE; }
@@ -24,6 +29,9 @@ class ESP32DAC : public output::FloatOutput, public Component {
24
29
  void write_state(float state) override;
25
30
 
26
31
  InternalGPIOPin *pin_;
32
+ #ifdef USE_ESP_IDF
33
+ dac_oneshot_handle_t dac_handle_;
34
+ #endif
27
35
  };
28
36
 
29
37
  } // namespace esp32_dac
@@ -1,15 +1,27 @@
1
+ import esphome.codegen as cg
2
+ import esphome.config_validation as cv
1
3
  from esphome import pins
2
4
  from esphome.components import output
3
- import esphome.config_validation as cv
4
- import esphome.codegen as cg
5
+ from esphome.components.esp32 import get_esp32_variant
6
+ from esphome.components.esp32.const import VARIANT_ESP32, VARIANT_ESP32S2
5
7
  from esphome.const import CONF_ID, CONF_NUMBER, CONF_PIN
6
8
 
7
9
  DEPENDENCIES = ["esp32"]
8
10
 
11
+ DAC_PINS = {
12
+ VARIANT_ESP32: (25, 26),
13
+ VARIANT_ESP32S2: (17, 18),
14
+ }
15
+
9
16
 
10
17
  def valid_dac_pin(value):
11
- num = value[CONF_NUMBER]
12
- cv.one_of(25, 26)(num)
18
+ variant = get_esp32_variant()
19
+ try:
20
+ valid_pins = DAC_PINS[variant]
21
+ except KeyError as ex:
22
+ raise cv.Invalid(f"DAC is not supported on {variant}") from ex
23
+ given_pin = value[CONF_NUMBER]
24
+ cv.one_of(*valid_pins)(given_pin)
13
25
  return value
14
26
 
15
27
 
@@ -247,8 +247,8 @@ async def to_code(config):
247
247
  )
248
248
  cg.add(log.pre_setup())
249
249
 
250
- for tag, level in config[CONF_LOGS].items():
251
- cg.add(log.set_log_level(tag, LOG_LEVELS[level]))
250
+ for tag, log_level in config[CONF_LOGS].items():
251
+ cg.add(log.set_log_level(tag, LOG_LEVELS[log_level]))
252
252
 
253
253
  cg.add_define("USE_LOGGER")
254
254
  this_severity = LOG_LEVEL_SEVERITY.index(level)
@@ -102,9 +102,6 @@ void Logger::log_vprintf_(int level, const char *tag, int line, const __FlashStr
102
102
  #endif
103
103
 
104
104
  int HOT Logger::level_for(const char *tag) {
105
- // Uses std::vector<> for low memory footprint, though the vector
106
- // could be sorted to minimize lookup times. This feature isn't used that
107
- // much anyway so it doesn't matter too much.
108
105
  if (this->log_levels_.count(tag) != 0)
109
106
  return this->log_levels_[tag];
110
107
  return this->current_level_;
@@ -9,10 +9,10 @@ namespace online_image {
9
9
  static const char *const TAG = "online_image.decoder";
10
10
 
11
11
  bool ImageDecoder::set_size(int width, int height) {
12
- bool resized = this->image_->resize_(width, height);
12
+ bool success = this->image_->resize_(width, height) > 0;
13
13
  this->x_scale_ = static_cast<double>(this->image_->buffer_width_) / width;
14
14
  this->y_scale_ = static_cast<double>(this->image_->buffer_height_) / height;
15
- return resized;
15
+ return success;
16
16
  }
17
17
 
18
18
  void ImageDecoder::draw(int x, int y, int w, int h, const Color &color) {
@@ -51,8 +51,9 @@ size_t DownloadBuffer::read(size_t len) {
51
51
  }
52
52
 
53
53
  size_t DownloadBuffer::resize(size_t size) {
54
- if (this->size_ == size) {
55
- return size;
54
+ if (this->size_ >= size) {
55
+ // Avoid useless reallocations; if the buffer is big enough, don't reallocate.
56
+ return this->size_;
56
57
  }
57
58
  this->allocator_.deallocate(this->buffer_, this->size_);
58
59
  this->buffer_ = this->allocator_.allocate(size);
@@ -61,6 +62,8 @@ size_t DownloadBuffer::resize(size_t size) {
61
62
  this->size_ = size;
62
63
  return size;
63
64
  } else {
65
+ ESP_LOGE(TAG, "allocation of %zu bytes failed. Biggest block in heap: %zu Bytes", size,
66
+ this->allocator_.get_max_free_block_size());
64
67
  this->size_ = 0;
65
68
  return 0;
66
69
  }
@@ -58,7 +58,7 @@ int HOT JpegDecoder::decode(uint8_t *buffer, size_t size) {
58
58
  }
59
59
 
60
60
  if (!this->jpeg_.openRAM(buffer, size, draw_callback)) {
61
- ESP_LOGE(TAG, "Could not open image for decoding.");
61
+ ESP_LOGE(TAG, "Could not open image for decoding: %d", this->jpeg_.getLastError());
62
62
  return DECODE_ERROR_INVALID_TYPE;
63
63
  }
64
64
  auto jpeg_type = this->jpeg_.getJPEGType();
@@ -73,7 +73,9 @@ int HOT JpegDecoder::decode(uint8_t *buffer, size_t size) {
73
73
 
74
74
  this->jpeg_.setUserPointer(this);
75
75
  this->jpeg_.setPixelType(RGB8888);
76
- this->set_size(this->jpeg_.getWidth(), this->jpeg_.getHeight());
76
+ if (!this->set_size(this->jpeg_.getWidth(), this->jpeg_.getHeight())) {
77
+ return DECODE_ERROR_OUT_OF_MEMORY;
78
+ }
77
79
  if (!this->jpeg_.decode(0, 0, 0)) {
78
80
  ESP_LOGE(TAG, "Error while decoding.");
79
81
  this->jpeg_.close();
@@ -64,33 +64,34 @@ void OnlineImage::release() {
64
64
  }
65
65
  }
66
66
 
67
- bool OnlineImage::resize_(int width_in, int height_in) {
67
+ size_t OnlineImage::resize_(int width_in, int height_in) {
68
68
  int width = this->fixed_width_;
69
69
  int height = this->fixed_height_;
70
- if (this->auto_resize_()) {
70
+ if (this->is_auto_resize_()) {
71
71
  width = width_in;
72
72
  height = height_in;
73
73
  if (this->width_ != width && this->height_ != height) {
74
74
  this->release();
75
75
  }
76
76
  }
77
+ size_t new_size = this->get_buffer_size_(width, height);
77
78
  if (this->buffer_) {
78
- return false;
79
+ // Buffer already allocated => no need to resize
80
+ return new_size;
79
81
  }
80
- size_t new_size = this->get_buffer_size_(width, height);
81
82
  ESP_LOGD(TAG, "Allocating new buffer of %zu bytes", new_size);
82
83
  this->buffer_ = this->allocator_.allocate(new_size);
83
84
  if (this->buffer_ == nullptr) {
84
85
  ESP_LOGE(TAG, "allocation of %zu bytes failed. Biggest block in heap: %zu Bytes", new_size,
85
86
  this->allocator_.get_max_free_block_size());
86
87
  this->end_connection_();
87
- return false;
88
+ return 0;
88
89
  }
89
90
  this->buffer_width_ = width;
90
91
  this->buffer_height_ = height;
91
92
  this->width_ = width;
92
93
  ESP_LOGV(TAG, "New size: (%d, %d)", width, height);
93
- return true;
94
+ return new_size;
94
95
  }
95
96
 
96
97
  void OnlineImage::update() {
@@ -99,9 +99,22 @@ class OnlineImage : public PollingComponent,
99
99
 
100
100
  int get_position_(int x, int y) const { return (x + y * this->buffer_width_) * this->get_bpp() / 8; }
101
101
 
102
- ESPHOME_ALWAYS_INLINE bool auto_resize_() const { return this->fixed_width_ == 0 || this->fixed_height_ == 0; }
102
+ ESPHOME_ALWAYS_INLINE bool is_auto_resize_() const { return this->fixed_width_ == 0 || this->fixed_height_ == 0; }
103
103
 
104
- bool resize_(int width, int height);
104
+ /**
105
+ * @brief Resize the image buffer to the requested dimensions.
106
+ *
107
+ * The buffer will be allocated if not existing.
108
+ * If the dimensions have been fixed in the yaml config, the buffer will be created
109
+ * with those dimensions and not resized, even on request.
110
+ * Otherwise, the old buffer will be deallocated and a new buffer with the requested
111
+ * allocated
112
+ *
113
+ * @param width
114
+ * @param height
115
+ * @return 0 if no memory could be allocated, the size of the new buffer otherwise.
116
+ */
117
+ size_t resize_(int width, int height);
105
118
 
106
119
  /**
107
120
  * @brief Draw a pixel into the buffer.
esphome/const.py CHANGED
@@ -1,6 +1,6 @@
1
1
  """Constants used by esphome."""
2
2
 
3
- __version__ = "2025.2.0b2"
3
+ __version__ = "2025.2.0b3"
4
4
 
5
5
  ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
6
6
  VALID_SUBSTITUTIONS_CHARACTERS = (
@@ -853,7 +853,7 @@ class InfoRequestHandler(BaseHandler):
853
853
  dashboard = DASHBOARD
854
854
  entry = dashboard.entries.get(yaml_path)
855
855
 
856
- if not entry:
856
+ if not entry or entry.storage is None:
857
857
  self.set_status(404)
858
858
  return
859
859
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: esphome
3
- Version: 2025.2.0b2
3
+ Version: 2025.2.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@nabucasa.com>
6
6
  License: MIT
@@ -5,7 +5,7 @@ esphome/codegen.py,sha256=GePHUM7xdXb_Pil59SHVsXg2F4VBPgkH-Fz2PDX8Z54,1873
5
5
  esphome/config.py,sha256=fFrDYbhWY1xn_onAl_0jwlg9D8NkK_FdKULTlnjZtxs,39832
6
6
  esphome/config_helpers.py,sha256=MKf_wzO35nn41FvigXE0iYKDslPgL2ruf8R-EPtTT2I,3256
7
7
  esphome/config_validation.py,sha256=qpNSoruGC4Tb7KNtgahginfMrhoRdjYUs-3Et2ww7rg,67868
8
- esphome/const.py,sha256=1lXArnKqFSKaGdxgtevHrwuyjUeIY8FbSlD8nSXPvcs,40664
8
+ esphome/const.py,sha256=PRGjerXXxdwRKVgQ7wqByHBvTqctKSQWkEIkEujmXRc,40664
9
9
  esphome/coroutine.py,sha256=j_14z8dIIzIBeuNO30D4c1RJvMMt1xZFZ58Evd-EvJA,9344
10
10
  esphome/cpp_generator.py,sha256=PS_vtNLykRldK7n2bSZ1e9zIEajnCNc_ruW9beMNulQ,31235
11
11
  esphome/cpp_helpers.py,sha256=6C2vNbOIhZKi43xRVlk5hp9GfshfBn-rc5D_ZFUEYaE,4801
@@ -851,9 +851,9 @@ esphome/components/esp32_can/canbus.py,sha256=sENR6HY7oBDkN_XBlz2I0qopVUC-chcGz6
851
851
  esphome/components/esp32_can/esp32_can.cpp,sha256=VYZSzI5GpCK-0-GOcFikQkzZrpqkp0loDVL2mRDJC-U,4920
852
852
  esphome/components/esp32_can/esp32_can.h,sha256=-u9xaLJtVAUj38SaBzPQ7q-rjydh2KEdaCn_1k27QEg,828
853
853
  esphome/components/esp32_dac/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
854
- esphome/components/esp32_dac/esp32_dac.cpp,sha256=Spv5dIh2KcUu6bYWUh7xMDhGK_L4iKeqTougxS_kUek,1085
855
- esphome/components/esp32_dac/esp32_dac.h,sha256=71O_rX_cYPPsUZR74H4UtzAMmrvN9fG0uBnq9GWThVc,689
856
- esphome/components/esp32_dac/output.py,sha256=K-2BLe_CM7wEHBZ7bwMkfUQ6EaZZy4WRcsNyBdmbNaw,960
854
+ esphome/components/esp32_dac/esp32_dac.cpp,sha256=ARw5vlGXxLaZeudHPYox3tmvXm5gbmAXEGCPXVGIvjQ,1312
855
+ esphome/components/esp32_dac/esp32_dac.h,sha256=9npbSQZn56U25fO7n8u4KdGCSBCc7UNyeGpr-Z_dFWI,846
856
+ esphome/components/esp32_dac/output.py,sha256=o3wj6WeLCFSXaU5aDF6zGznughufUCVNz3QgN6mqC08,1362
857
857
  esphome/components/esp32_hall/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
858
858
  esphome/components/esp32_hall/esp32_hall.cpp,sha256=UkxwSJHOnpCWb1Coo6ulEUMOyE8qaqUK4D5mTCSSfio,707
859
859
  esphome/components/esp32_hall/esp32_hall.h,sha256=2SPP7QOKdL7MjMd8MphXHnt6nOu7fT-16O_MT59aDiI,399
@@ -1459,8 +1459,8 @@ esphome/components/lock/__init__.py,sha256=GMClddiRBqyVuvmNWD_R7u8FBxN9hl0s00Y62
1459
1459
  esphome/components/lock/automation.h,sha256=aOcWJAY1XffSAK8LaywJpx1Bbdh0Ri_FS6low-20mic,2066
1460
1460
  esphome/components/lock/lock.cpp,sha256=IyEt5xShAxMpmcn_GAPFv2lRCS-kr4MjjfExxfXuK-Q,3212
1461
1461
  esphome/components/lock/lock.h,sha256=kFFccTAu56e6PhZVATW0NznOj0M7VByEn9gc6l5M3eA,6042
1462
- esphome/components/logger/__init__.py,sha256=-9oCAGgFIEzbplXMwbiazdOSJXkK7Bdms24MDndWhPM,13773
1463
- esphome/components/logger/logger.cpp,sha256=Yq3DFxzBRo4AR3JMy_ttgzcFQmzrHRJSp6AHnsqkWxo,6867
1462
+ esphome/components/logger/__init__.py,sha256=oU1X8krvf8JyXctFjpfip5ZEZp_QeJuicVmZLLxC4W0,13781
1463
+ esphome/components/logger/logger.cpp,sha256=MzNwXhh4eIx4R4TmN50yYJiILONIpmG9uRiOemU6ojU,6675
1464
1464
  esphome/components/logger/logger.h,sha256=krzoy-R-9CIfNrVpIhGjHdq30YpT-KtBxniSkIag3ug,6095
1465
1465
  esphome/components/logger/logger_esp32.cpp,sha256=SOLN5oHiVbnItxw4wdhvNdeunwgY7FR5j752fEt9__M,6101
1466
1466
  esphome/components/logger/logger_esp8266.cpp,sha256=k7GvUlcLxXCVYqBw7tlHRikmRe7hdO6qV837wr4N2ww,1182
@@ -1982,12 +1982,12 @@ esphome/components/one_wire/one_wire_bus.h,sha256=06hhoL5DNkzLEIBzBcnEoOPB4kuPxt
1982
1982
  esphome/components/online_image/__init__.py,sha256=Xq5yjzakmBtOmX-F354EXds6A9l0K7QUWNbuOyn0Bao,6231
1983
1983
  esphome/components/online_image/bmp_image.cpp,sha256=v1mmhzhi0lzcz-q9tcyNwfni4DGJMPtVBnAmXQM7erY,3295
1984
1984
  esphome/components/online_image/bmp_image.h,sha256=9ExIs8n2nROXu3Qnf1JHJoTTqR0tssTNvivcaYzp_W0,878
1985
- esphome/components/online_image/image_decoder.cpp,sha256=0r0fn5sWttfhQYOGA_r12sAmL3AR6MRByDjVY3b_pL8,1971
1985
+ esphome/components/online_image/image_decoder.cpp,sha256=p_693Ac8F-vs2n_1AZ7E57HBfLhAeeBWYpI3tDy6rnE,2215
1986
1986
  esphome/components/online_image/image_decoder.h,sha256=A8sU-3m5dkyR8S2wXbeR7v7C5mRSLxrvfvsBPYz3a90,3798
1987
- esphome/components/online_image/jpeg_image.cpp,sha256=-q73YrkGEi-Gzx0v6q3zpzE7a9tZ0pGaKOOqigMhh14,2786
1987
+ esphome/components/online_image/jpeg_image.cpp,sha256=1qDTfzp7H6oxuRVBVXXgglourmlcBO4uvxQK6YLDFl4,2867
1988
1988
  esphome/components/online_image/jpeg_image.h,sha256=RxlXrSxgd_j7tXYMGdkU1gVmkWB6Jc0YHuq13NrY9fc,741
1989
- esphome/components/online_image/online_image.cpp,sha256=DLr09W0G0DUAixzF2KbpljEb2OKuM1cnylfVpcUIUyY,10507
1990
- esphome/components/online_image/online_image.h,sha256=KeBs_Nfo8rl3Rcqc7odS0Fw_5Xt6xaO8CfiV1oWTRKQ,6662
1989
+ esphome/components/online_image/online_image.cpp,sha256=4gJksrHknRF4ZxKRL8gnBMsh_kKY_YV5177tIrr4hzw,10568
1990
+ esphome/components/online_image/online_image.h,sha256=40F0zWRI0p6A8pFfQdQ1eD5tnwgCxBDbeNcpCHgeUzk,7177
1991
1991
  esphome/components/online_image/png_image.cpp,sha256=ysXfjX05YPuZaG0wxHg0EiPlj3HlddQqUdDG25W1jpY,2432
1992
1992
  esphome/components/online_image/png_image.h,sha256=oDyTIkyOB2MiKxZ9YmctwN7sbc_E7Qz0PvFxWg9Lip8,783
1993
1993
  esphome/components/opentherm/__init__.py,sha256=-umXAoDxOXrQ_ANQkGeMTB5cWp9V1KwSzdOHcAFXgJc,5497
@@ -3423,7 +3423,7 @@ esphome/dashboard/dns.py,sha256=zJjzjjuJsnHXW59V-H1QqjwwqJFgtJUIsB2QUcALZns,1369
3423
3423
  esphome/dashboard/entries.py,sha256=jbmvXQ5-zeUBVrd80tupYmStRsTwGp0hbfG7ZIRQF94,13130
3424
3424
  esphome/dashboard/enum.py,sha256=rlQFVVxyBt5Iw7OL0o9F8D5LGgw23tbvi-KYjzP0QUQ,597
3425
3425
  esphome/dashboard/settings.py,sha256=xoN2eLh-t0hmVYLmZm9beVOqonPNqWkzpRsoPbEomoA,2962
3426
- esphome/dashboard/web_server.py,sha256=cSWc_M4ieUg_O0DpQYBM-bDDkhkSF4wFvDRAUVtf08s,42211
3426
+ esphome/dashboard/web_server.py,sha256=rt5BDvjyJ65VJ-9tZA3V0KoB0RUtSLcrTec7jWncoYw,42236
3427
3427
  esphome/dashboard/status/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3428
3428
  esphome/dashboard/status/mdns.py,sha256=FuASYxcQ-LQVK5vqX9ZLs9wIXlmXZh4tjXhg-Zmpq14,3741
3429
3429
  esphome/dashboard/status/mqtt.py,sha256=ZRb18LOvl4975Pzc4Fdr5ErML3WKwV8Pv1sD2qdSJ1s,1965
@@ -3434,9 +3434,9 @@ esphome/dashboard/util/itertools.py,sha256=8eLrWEWmICLtXNxkKdYPQV0c_N4GEz8m9Npnb
3434
3434
  esphome/dashboard/util/password.py,sha256=cQz3b9B-ijTe7zS6BeCW0hc3pWv6JjC78jmnycYYAh8,321
3435
3435
  esphome/dashboard/util/subprocess.py,sha256=T8EW6dbU4LPd2DG1dRrdh8li71tt6J1isn411poMhkk,1022
3436
3436
  esphome/dashboard/util/text.py,sha256=ENDnfN4O0NdA3CKVJjQYabFbwbrsIhVKrAMQe53qYu4,534
3437
- esphome-2025.2.0b2.dist-info/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3438
- esphome-2025.2.0b2.dist-info/METADATA,sha256=Z1Su6fIDf73B7X47khzxxAj0TMw-fjlqQkmOgwrs4P4,3683
3439
- esphome-2025.2.0b2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
3440
- esphome-2025.2.0b2.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3441
- esphome-2025.2.0b2.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3442
- esphome-2025.2.0b2.dist-info/RECORD,,
3437
+ esphome-2025.2.0b3.dist-info/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3438
+ esphome-2025.2.0b3.dist-info/METADATA,sha256=GTvd5dxiyRfgUb-le69sv8KvfbzAq6jT81X8vwpTDhw,3683
3439
+ esphome-2025.2.0b3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
3440
+ esphome-2025.2.0b3.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3441
+ esphome-2025.2.0b3.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3442
+ esphome-2025.2.0b3.dist-info/RECORD,,