esphome 2025.3.1__py3-none-any.whl → 2025.3.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.
@@ -72,6 +72,8 @@ void CST226Touchscreen::continue_setup_() {
72
72
  if (this->read16_(0xD1F8, buffer, 4)) {
73
73
  this->x_raw_max_ = buffer[0] + (buffer[1] << 8);
74
74
  this->y_raw_max_ = buffer[2] + (buffer[3] << 8);
75
+ if (this->swap_x_y_)
76
+ std::swap(this->x_raw_max_, this->y_raw_max_);
75
77
  } else {
76
78
  this->x_raw_max_ = this->display_->get_native_width();
77
79
  this->y_raw_max_ = this->display_->get_native_height();
@@ -34,26 +34,29 @@ void EKTF2232Touchscreen::setup() {
34
34
 
35
35
  // Get touch resolution
36
36
  uint8_t received[4];
37
- if (this->x_raw_max_ == this->x_raw_min_) {
38
- this->write(GET_X_RES, 4);
39
- if (this->read(received, 4)) {
40
- ESP_LOGE(TAG, "Failed to read X resolution!");
41
- this->interrupt_pin_->detach_interrupt();
42
- this->mark_failed();
43
- return;
37
+ if (this->x_raw_max_ == 0 || this->y_raw_max_ == 0) {
38
+ auto err = this->write(GET_X_RES, 4);
39
+ if (err == i2c::ERROR_OK) {
40
+ err = this->read(received, 4);
41
+ if (err == i2c::ERROR_OK) {
42
+ this->x_raw_max_ = ((received[2])) | ((received[3] & 0xf0) << 4);
43
+ err = this->write(GET_Y_RES, 4);
44
+ if (err == i2c::ERROR_OK) {
45
+ err = this->read(received, 4);
46
+ if (err == i2c::ERROR_OK) {
47
+ this->y_raw_max_ = ((received[2])) | ((received[3] & 0xf0) << 4);
48
+ }
49
+ }
50
+ }
44
51
  }
45
- this->x_raw_max_ = ((received[2])) | ((received[3] & 0xf0) << 4);
46
- }
47
-
48
- if (this->y_raw_max_ == this->y_raw_min_) {
49
- this->write(GET_Y_RES, 4);
50
- if (this->read(received, 4)) {
51
- ESP_LOGE(TAG, "Failed to read Y resolution!");
52
+ if (err != i2c::ERROR_OK) {
53
+ ESP_LOGE(TAG, "Failed to read calibration values!");
52
54
  this->interrupt_pin_->detach_interrupt();
53
55
  this->mark_failed();
54
56
  return;
55
57
  }
56
- this->y_raw_max_ = ((received[2])) | ((received[3] & 0xf0) << 4);
58
+ if (this->swap_x_y_)
59
+ std::swap(this->x_raw_max_, this->y_raw_max_);
57
60
  }
58
61
  this->set_power_state(true);
59
62
  }
@@ -7,7 +7,15 @@ from pathlib import Path
7
7
  import re
8
8
 
9
9
  import esphome_glyphsets as glyphsets
10
- from freetype import Face, ft_pixel_mode_grays, ft_pixel_mode_mono
10
+
11
+ # pylint: disable=no-name-in-module
12
+ from freetype import (
13
+ FT_LOAD_NO_BITMAP,
14
+ FT_LOAD_RENDER,
15
+ FT_LOAD_TARGET_MONO,
16
+ Face,
17
+ ft_pixel_mode_mono,
18
+ )
11
19
  import requests
12
20
 
13
21
  from esphome import external_files
@@ -204,7 +212,7 @@ def validate_font_config(config):
204
212
  if font.get_char_index(x) != 0
205
213
  ]
206
214
 
207
- if font.has_fixed_sizes:
215
+ if not font.is_scalable:
208
216
  sizes = [pt_to_px(x.size) for x in font.available_sizes]
209
217
  if not sizes:
210
218
  raise cv.Invalid(
@@ -501,17 +509,23 @@ async def to_code(config):
501
509
  glyph_args = {}
502
510
  data = []
503
511
  bpp = config[CONF_BPP]
504
- mode = ft_pixel_mode_grays
505
512
  scale = 256 // (1 << bpp)
506
513
  size = config[CONF_SIZE]
507
514
  # create the data array for all glyphs
508
515
  for codepoint in codepoints:
509
516
  font = point_font_map[codepoint]
510
- format = font.get_format().decode("utf-8")
511
- if format != "PCF":
517
+ if not font.is_scalable:
518
+ sizes = [pt_to_px(x.size) for x in font.available_sizes]
519
+ if size in sizes:
520
+ font.select_size(sizes.index(size))
521
+ else:
512
522
  font.set_pixel_sizes(size, 0)
513
- font.load_char(codepoint)
514
- font.glyph.render(mode)
523
+ flags = FT_LOAD_RENDER
524
+ if bpp != 1:
525
+ flags |= FT_LOAD_NO_BITMAP
526
+ else:
527
+ flags |= FT_LOAD_TARGET_MONO
528
+ font.load_char(codepoint, flags)
515
529
  width = font.glyph.bitmap.width
516
530
  height = font.glyph.bitmap.rows
517
531
  buffer = font.glyph.bitmap.buffer
@@ -535,7 +549,7 @@ async def to_code(config):
535
549
  pos += 1
536
550
  ascender = pt_to_px(font.size.ascender)
537
551
  if ascender == 0:
538
- if font.has_fixed_sizes:
552
+ if not font.is_scalable:
539
553
  ascender = size
540
554
  else:
541
555
  _LOGGER.error(
@@ -585,7 +599,7 @@ async def to_code(config):
585
599
  font_height = pt_to_px(base_font.size.height)
586
600
  ascender = pt_to_px(base_font.size.ascender)
587
601
  if font_height == 0:
588
- if base_font.has_fixed_sizes:
602
+ if not base_font.is_scalable:
589
603
  font_height = size
590
604
  ascender = font_height
591
605
  else:
@@ -60,20 +60,25 @@ void GT911Touchscreen::setup() {
60
60
  }
61
61
  }
62
62
  }
63
- if (err == i2c::ERROR_OK) {
64
- err = this->write(GET_MAX_VALUES, 2);
63
+ if (this->x_raw_max_ == 0 || this->y_raw_max_ == 0) {
64
+ // no calibration? Attempt to read the max values from the touchscreen.
65
65
  if (err == i2c::ERROR_OK) {
66
- err = this->read(data, sizeof(data));
66
+ err = this->write(GET_MAX_VALUES, 2);
67
67
  if (err == i2c::ERROR_OK) {
68
- if (this->x_raw_max_ == this->x_raw_min_) {
68
+ err = this->read(data, sizeof(data));
69
+ if (err == i2c::ERROR_OK) {
69
70
  this->x_raw_max_ = encode_uint16(data[1], data[0]);
70
- }
71
- if (this->y_raw_max_ == this->y_raw_min_) {
72
71
  this->y_raw_max_ = encode_uint16(data[3], data[2]);
72
+ if (this->swap_x_y_)
73
+ std::swap(this->x_raw_max_, this->y_raw_max_);
73
74
  }
74
- esph_log_d(TAG, "calibration max_x/max_y %d/%d", this->x_raw_max_, this->y_raw_max_);
75
75
  }
76
76
  }
77
+ if (err != i2c::ERROR_OK) {
78
+ ESP_LOGE(TAG, "Failed to read calibration values from touchscreen!");
79
+ this->mark_failed();
80
+ return;
81
+ }
77
82
  }
78
83
  if (err != i2c::ERROR_OK) {
79
84
  ESP_LOGE(TAG, "Failed to communicate!");
@@ -15,6 +15,7 @@ namespace esphome {
15
15
  namespace ld2450 {
16
16
 
17
17
  static const char *const TAG = "ld2450";
18
+ static const char *const NO_MAC("08:05:04:03:02:01");
18
19
  static const char *const UNKNOWN_MAC("unknown");
19
20
 
20
21
  // LD2450 UART Serial Commands
@@ -614,12 +615,12 @@ bool LD2450Component::handle_ack_data_(uint8_t *buffer, uint8_t len) {
614
615
  ESP_LOGV(TAG, "MAC address: %s", this->mac_.c_str());
615
616
  #ifdef USE_TEXT_SENSOR
616
617
  if (this->mac_text_sensor_ != nullptr) {
617
- this->mac_text_sensor_->publish_state(this->mac_);
618
+ this->mac_text_sensor_->publish_state(this->mac_ == NO_MAC ? UNKNOWN_MAC : this->mac_);
618
619
  }
619
620
  #endif
620
621
  #ifdef USE_SWITCH
621
622
  if (this->bluetooth_switch_ != nullptr) {
622
- this->bluetooth_switch_->publish_state(this->mac_ != UNKNOWN_MAC);
623
+ this->bluetooth_switch_->publish_state(this->mac_ != NO_MAC);
623
624
  }
624
625
  #endif
625
626
  break;
@@ -56,7 +56,8 @@ const char *media_player_command_to_string(MediaPlayerCommand command) {
56
56
 
57
57
  void MediaPlayerCall::validate_() {
58
58
  if (this->media_url_.has_value()) {
59
- if (this->command_.has_value()) {
59
+ if (this->command_.has_value() && this->command_.value() != MEDIA_PLAYER_COMMAND_ENQUEUE) {
60
+ // Don't remove an enqueue command
60
61
  ESP_LOGW(TAG, "MediaPlayerCall: Setting both command and media_url is not needed.");
61
62
  this->command_.reset();
62
63
  }
@@ -138,77 +138,48 @@ void SpeakerMediaPlayer::watch_media_commands_() {
138
138
  }
139
139
 
140
140
  MediaCallCommand media_command;
141
- esp_err_t err = ESP_OK;
142
141
 
143
142
  if (xQueueReceive(this->media_control_command_queue_, &media_command, 0) == pdTRUE) {
144
- bool new_url = media_command.new_url.has_value() && media_command.new_url.value();
145
- bool new_file = media_command.new_file.has_value() && media_command.new_file.value();
143
+ bool enqueue = media_command.enqueue.has_value() && media_command.enqueue.value();
146
144
 
147
- if (new_url || new_file) {
148
- bool enqueue = media_command.enqueue.has_value() && media_command.enqueue.value();
145
+ if (media_command.url.has_value() || media_command.file.has_value()) {
146
+ PlaylistItem playlist_item;
147
+ if (media_command.url.has_value()) {
148
+ playlist_item.url = *media_command.url.value();
149
+ delete media_command.url.value();
150
+ }
151
+ if (media_command.file.has_value()) {
152
+ playlist_item.file = media_command.file.value();
153
+ }
149
154
 
150
155
  if (this->single_pipeline_() || (media_command.announce.has_value() && media_command.announce.value())) {
151
- // Announcement playlist/pipeline
152
-
153
156
  if (!enqueue) {
154
- // Clear the queue and ensure the loaded next item doesn't start playing
157
+ // Ensure the loaded next item doesn't start playing, clear the queue, start the file, and unpause
155
158
  this->cancel_timeout("next_ann");
156
159
  this->announcement_playlist_.clear();
157
- }
158
-
159
- PlaylistItem playlist_item;
160
- if (new_url) {
161
- playlist_item.url = this->announcement_url_;
162
- if (!enqueue) {
163
- // Not adding to the queue, so directly start playback and internally unpause the pipeline
164
- this->announcement_pipeline_->start_url(playlist_item.url.value());
165
- this->announcement_pipeline_->set_pause_state(false);
166
- }
167
- } else {
168
- playlist_item.file = this->announcement_file_;
169
- if (!enqueue) {
170
- // Not adding to the queue, so directly start playback and internally unpause the pipeline
160
+ if (media_command.file.has_value()) {
171
161
  this->announcement_pipeline_->start_file(playlist_item.file.value());
172
- this->announcement_pipeline_->set_pause_state(false);
162
+ } else if (media_command.url.has_value()) {
163
+ this->announcement_pipeline_->start_url(playlist_item.url.value());
173
164
  }
165
+ this->announcement_pipeline_->set_pause_state(false);
174
166
  }
175
167
  this->announcement_playlist_.push_back(playlist_item);
176
168
  } else {
177
- // Media playlist/pipeline
178
-
179
169
  if (!enqueue) {
180
- // Clear the queue and ensure the loaded next item doesn't start playing
170
+ // Ensure the loaded next item doesn't start playing, clear the queue, start the file, and unpause
181
171
  this->cancel_timeout("next_media");
182
172
  this->media_playlist_.clear();
183
- }
184
-
185
- this->is_paused_ = false;
186
- PlaylistItem playlist_item;
187
- if (new_url) {
188
- playlist_item.url = this->media_url_;
189
- if (!enqueue) {
190
- // Not adding to the queue, so directly start playback and internally unpause the pipeline
191
- this->media_pipeline_->start_url(playlist_item.url.value());
192
- this->media_pipeline_->set_pause_state(false);
193
- }
194
- } else {
195
- playlist_item.file = this->media_file_;
196
- if (!enqueue) {
197
- // Not adding to the queue, so directly start playback and internally unpause the pipeline
173
+ if (media_command.file.has_value()) {
198
174
  this->media_pipeline_->start_file(playlist_item.file.value());
199
- this->media_pipeline_->set_pause_state(false);
175
+ } else if (media_command.url.has_value()) {
176
+ this->media_pipeline_->start_url(playlist_item.url.value());
200
177
  }
178
+ this->media_pipeline_->set_pause_state(false);
201
179
  }
202
180
  this->media_playlist_.push_back(playlist_item);
203
181
  }
204
182
 
205
- if (err != ESP_OK) {
206
- ESP_LOGE(TAG, "Error starting the audio pipeline: %s", esp_err_to_name(err));
207
- this->status_set_error();
208
- } else {
209
- this->status_clear_error();
210
- }
211
-
212
183
  return; // Don't process the new file play command further
213
184
  }
214
185
 
@@ -429,12 +400,10 @@ void SpeakerMediaPlayer::play_file(audio::AudioFile *media_file, bool announceme
429
400
 
430
401
  MediaCallCommand media_command;
431
402
 
432
- media_command.new_file = true;
403
+ media_command.file = media_file;
433
404
  if (this->single_pipeline_() || announcement) {
434
- this->announcement_file_ = media_file;
435
405
  media_command.announce = true;
436
406
  } else {
437
- this->media_file_ = media_file;
438
407
  media_command.announce = false;
439
408
  }
440
409
  media_command.enqueue = enqueue;
@@ -456,14 +425,8 @@ void SpeakerMediaPlayer::control(const media_player::MediaPlayerCall &call) {
456
425
  }
457
426
 
458
427
  if (call.get_media_url().has_value()) {
459
- std::string new_uri = call.get_media_url().value();
460
-
461
- media_command.new_url = true;
462
- if (this->single_pipeline_() || (call.get_announcement().has_value() && call.get_announcement().value())) {
463
- this->announcement_url_ = new_uri;
464
- } else {
465
- this->media_url_ = new_uri;
466
- }
428
+ media_command.url = new std::string(
429
+ call.get_media_url().value()); // Must be manually deleted after receiving media_command from a queue
467
430
 
468
431
  if (call.get_command().has_value()) {
469
432
  if (call.get_command().value() == media_player::MEDIA_PLAYER_COMMAND_ENQUEUE) {
@@ -24,8 +24,8 @@ struct MediaCallCommand {
24
24
  optional<media_player::MediaPlayerCommand> command;
25
25
  optional<float> volume;
26
26
  optional<bool> announce;
27
- optional<bool> new_url;
28
- optional<bool> new_file;
27
+ optional<std::string *> url; // Must be manually deleted after receiving this struct from a queue
28
+ optional<audio::AudioFile *> file;
29
29
  optional<bool> enqueue;
30
30
  };
31
31
 
@@ -109,15 +109,11 @@ class SpeakerMediaPlayer : public Component, public media_player::MediaPlayer {
109
109
 
110
110
  optional<media_player::MediaPlayerSupportedFormat> media_format_;
111
111
  AudioPipelineState media_pipeline_state_{AudioPipelineState::STOPPED};
112
- std::string media_url_{}; // only modified by control function
113
- audio::AudioFile *media_file_{}; // only modified by play_file function
114
112
  bool media_repeat_one_{false};
115
113
  uint32_t media_playlist_delay_ms_{0};
116
114
 
117
115
  optional<media_player::MediaPlayerSupportedFormat> announcement_format_;
118
116
  AudioPipelineState announcement_pipeline_state_{AudioPipelineState::STOPPED};
119
- std::string announcement_url_{}; // only modified by control function
120
- audio::AudioFile *announcement_file_{}; // only modified by play_file function
121
117
  bool announcement_repeat_one_{false};
122
118
  uint32_t announcement_playlist_delay_ms_{0};
123
119
 
esphome/const.py CHANGED
@@ -1,6 +1,6 @@
1
1
  """Constants used by esphome."""
2
2
 
3
- __version__ = "2025.3.1"
3
+ __version__ = "2025.3.2"
4
4
 
5
5
  ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
6
6
  VALID_SUBSTITUTIONS_CHARACTERS = (
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: esphome
3
- Version: 2025.3.1
3
+ Version: 2025.3.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@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=9KOhLHQXmDbahg6zHynXfXDfAL2bciu35_SHxHrzZ2M,63705
8
- esphome/const.py,sha256=Z-fLrCBLlybH5KtmXHQNv8bjBDCoOb0JPyjE6tSTtdI,40762
8
+ esphome/const.py,sha256=rwHb_1x4HaQyAMW_pj8GoImb98c_P3aQF2G5skP1ND8,40762
9
9
  esphome/coroutine.py,sha256=j_14z8dIIzIBeuNO30D4c1RJvMMt1xZFZ58Evd-EvJA,9344
10
10
  esphome/cpp_generator.py,sha256=1g-y3fxWSrd5Kpbz6DrJXaQajjuwQiTIaTRIz9n7svI,31237
11
11
  esphome/cpp_helpers.py,sha256=6C2vNbOIhZKi43xRVlk5hp9GfshfBn-rc5D_ZFUEYaE,4801
@@ -568,7 +568,7 @@ esphome/components/cse7766/cse7766.h,sha256=RE_q5Sa2n8PLkQsO3C9Nt11g6PS_5XBIVD1w
568
568
  esphome/components/cse7766/sensor.py,sha256=rHZGEUgTD8j6V9u8kTKSfRWQ67HzqIeHa9YaC5j6K70,4082
569
569
  esphome/components/cst226/__init__.py,sha256=Xbt13-GS0lUNexCt3EYip3UvO15P2cdJdepZWoDqBw8,130
570
570
  esphome/components/cst226/touchscreen/__init__.py,sha256=cGkF2fb0drtC0Xnz_quMC-uYSoqnXXMTzzEpjr6aP74,1215
571
- esphome/components/cst226/touchscreen/cst226_touchscreen.cpp,sha256=tvs9x9I5xijYH83nesN3Vyo-CzXiw4ups0yJ7heV8p8,2792
571
+ esphome/components/cst226/touchscreen/cst226_touchscreen.cpp,sha256=OsPEVSYsvG6bJmAtkS4muGEQwY31wrg7R0AxctEUohw,2874
572
572
  esphome/components/cst226/touchscreen/cst226_touchscreen.h,sha256=x5q0en-w0ebNgoBznouwrZd1VD_gy9J6accuyQhMcmw,1221
573
573
  esphome/components/cst816/__init__.py,sha256=7XLTtm_EM7-QP8ZfGtLQi1KBroiWOqeRMBTjTbXt-8Q,130
574
574
  esphome/components/cst816/binary_sensor/__init__.py,sha256=xOKwMOe_N3twSMYNb5y2i_tUCQ7umUDA6rUrGg51NAc,190
@@ -732,7 +732,7 @@ esphome/components/ee895/ee895.h,sha256=PlW9Q8XFN6_V0SJxD3k-upafHEXvSLbvRb5JINp5
732
732
  esphome/components/ee895/sensor.py,sha256=UUaWHFHVHqwubCzEJ4da-SzXezojdFc8_QQh70449w4,2172
733
733
  esphome/components/ektf2232/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
734
734
  esphome/components/ektf2232/touchscreen/__init__.py,sha256=sJg6n62UTHjwDvsFPtJe4tkNxiWqOXrdMjLj6TUufdE,1271
735
- esphome/components/ektf2232/touchscreen/ektf2232.cpp,sha256=gZ2uurraay8lbuSn0IvLW3eC_LJEa7cj64KWQd0Mu1I,3496
735
+ esphome/components/ektf2232/touchscreen/ektf2232.cpp,sha256=F7uBZmlEn8T3nfkJ96GOVbvP923PmigyvJC_vS1UOIY,3640
736
736
  esphome/components/ektf2232/touchscreen/ektf2232.h,sha256=7Lr7YYdTWZOUUfMdg1nVw2JVjvhVhn2XvZKbMc1GFlY,827
737
737
  esphome/components/emc2101/__init__.py,sha256=2kE5cXQkG9tkU87DFLKxB0cX5WUqdAvZWzZnJaZ9RjQ,2808
738
738
  esphome/components/emc2101/emc2101.cpp,sha256=SdeT5uVNWEQ77lHbtH0KOyckCr1PfHB67Q6zQXqzJRg,6921
@@ -952,7 +952,7 @@ esphome/components/fingerprint_grow/binary_sensor.py,sha256=NeVcqVCpmjGdnfimIIWS
952
952
  esphome/components/fingerprint_grow/fingerprint_grow.cpp,sha256=xtHEpnp1Ei_5s5SS5Vfxt8vG_PoPMmeUjbOQHWrn5G0,18675
953
953
  esphome/components/fingerprint_grow/fingerprint_grow.h,sha256=UEkLR4Cqas_XYlTLAwscXCAMRoprWeQZEZ_3vTsI-BM,11206
954
954
  esphome/components/fingerprint_grow/sensor.py,sha256=eazvZvdtt1Rl8o3Aw6eYKn-kb2sNDfZKHegxpFFdQeg,2244
955
- esphome/components/font/__init__.py,sha256=r7IpPuAOAJuPyz9tvnb_q9T9QTLuH2-ti-D3iDGOG9A,18893
955
+ esphome/components/font/__init__.py,sha256=dfieu9eop8dl0oGvc19EMQVq6qH8HiyA4FrlFOnUMFY,19199
956
956
  esphome/components/font/font.cpp,sha256=dxZID-p7toxsAe3JZIc6syEdleARl-H3IRWoUIFGUOY,5361
957
957
  esphome/components/font/font.h,sha256=lBUD-bX8qK0Us0tVjq9i38EJVG6p9w4npKnW1L_ILx0,2024
958
958
  esphome/components/fs3000/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1039,7 +1039,7 @@ esphome/components/gt911/binary_sensor/__init__.py,sha256=fx8W9VhBGssxRD21iTQGva
1039
1039
  esphome/components/gt911/binary_sensor/gt911_button.cpp,sha256=KACuxHcVbk3TZdSPy-8kO4j0LZZZmdAy4VWMicnaoLY,586
1040
1040
  esphome/components/gt911/binary_sensor/gt911_button.h,sha256=3QCm3g8Ca9VtsKKjWgc_Bre4Dc3RhXgaLt1Mq3iEKd8,714
1041
1041
  esphome/components/gt911/touchscreen/__init__.py,sha256=Hx69_ljCE1F-dP5BzEoQ7vIcOTy9_AsnDBb9FH3pCpU,1155
1042
- esphome/components/gt911/touchscreen/gt911_touchscreen.cpp,sha256=a9GWnw4Ykn5neAD1RXayC8dZ950pPRhZnL-h3p9V8KQ,4505
1042
+ esphome/components/gt911/touchscreen/gt911_touchscreen.cpp,sha256=pxFm2WgskgUy2hK13nAXqp72GpvjH9dbVk-LqYS_ggs,4684
1043
1043
  esphome/components/gt911/touchscreen/gt911_touchscreen.h,sha256=q-ZvP6OEGk8TU9eNfWI5-Bj5lVz-DXkxEGEiSzYr2L0,1026
1044
1044
  esphome/components/haier/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1045
1045
  esphome/components/haier/automation.h,sha256=xHnMbqHWFwtibKxgqLraPeNlKLWv2_AT7VX0aMVYtr8,3688
@@ -1396,7 +1396,7 @@ esphome/components/ld2420/text_sensor/text_sensor.cpp,sha256=T8Hlo3rGbyEpKMlFHTf
1396
1396
  esphome/components/ld2420/text_sensor/text_sensor.h,sha256=aK91ri0NvHth3ya0zN1OeX81v1nqveoiJcOfqCpaAJI,672
1397
1397
  esphome/components/ld2450/__init__.py,sha256=5QeRhMvHdL4UVu4Qv80Ly78UOXU28kzWEAPxPKpNVNQ,1280
1398
1398
  esphome/components/ld2450/binary_sensor.py,sha256=SyIw9c-4JqNm8JKuzSKA9rVWaVCGsYAslV0VbhqJnoM,1755
1399
- esphome/components/ld2450/ld2450.cpp,sha256=UMc-kzDOsVHR100J5Zjl8SiUUhrvgh5PydOz9_7I_EM,29993
1399
+ esphome/components/ld2450/ld2450.cpp,sha256=WMUKdVmBpT6f4RhJTo8Ep0oA4MnwlYfSEYsTbx4MLtc,30079
1400
1400
  esphome/components/ld2450/ld2450.h,sha256=7mTGWij9R__PpeonHR7TbxZkvJVdmIiaAoU7jB5fR2U,7984
1401
1401
  esphome/components/ld2450/sensor.py,sha256=bEowM_OzazFp3kSAnyGtw0W8AsX2K5znbCYU4DObqNQ,6570
1402
1402
  esphome/components/ld2450/text_sensor.py,sha256=msgqwIFvkSrewI7MP_KPKMWdMOEpPFOj0hhsfudUfho,2009
@@ -1710,7 +1710,7 @@ esphome/components/mdns/mdns_libretiny.cpp,sha256=j3uX11MTYYO1WEN6X-UyuqMt9i6Fz0
1710
1710
  esphome/components/mdns/mdns_rp2040.cpp,sha256=AzSFWtVJtq2dA9wJIFkvZvk8r_7oYbdFVtGVRxNBSgg,1306
1711
1711
  esphome/components/media_player/__init__.py,sha256=5JO0c-8j-kOBXCOaN-FiYlQh0vw9DHEnTuj_muZAalc,8337
1712
1712
  esphome/components/media_player/automation.h,sha256=1aQDiCcXCfbwi2WrU8WyaPnW9MfR95-f9MhFNBhQ3kI,3685
1713
- esphome/components/media_player/media_player.cpp,sha256=G5OfVIbtJxe5QzpaaX4BC_kVWwbzN-CfMi-LSo12eUg,4354
1713
+ esphome/components/media_player/media_player.cpp,sha256=VIaMoEUzX7Z95Ng8iCfBWEG3_2469WETuhokRRF2KP4,4453
1714
1714
  esphome/components/media_player/media_player.h,sha256=dXDuZ2apylAj78YccKfoJzX_qscoUN-5KYGKYxiwYv4,3252
1715
1715
  esphome/components/mhz19/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1716
1716
  esphome/components/mhz19/mhz19.cpp,sha256=CBBVBMqGUsrc-4PMOaBDuKCAFNr43Kukt3a018kQI0k,3924
@@ -2690,8 +2690,8 @@ esphome/components/speaker/media_player/__init__.py,sha256=-bV3Fps2AGFUEW8C35py8
2690
2690
  esphome/components/speaker/media_player/audio_pipeline.cpp,sha256=CxWJFkt3IUb4o1w6ajh2rnINUqUSOK6RigEeFEGkMus,22365
2691
2691
  esphome/components/speaker/media_player/audio_pipeline.h,sha256=MYt7_kp4IJDSTnXWqLaXIkbbNkGx6F_imSryFo2UUkc,5000
2692
2692
  esphome/components/speaker/media_player/automation.h,sha256=I8psUHnJ8T3fkM05h1yEYDxb0yWe6Vjz7i30OSVA3Is,683
2693
- esphome/components/speaker/media_player/speaker_media_player.cpp,sha256=cAzlSzzeUKRRssimFqNDz4qA98D-qcAgy8OMTHCiZQs,22777
2694
- esphome/components/speaker/media_player/speaker_media_player.h,sha256=iQ9mszQDH9RAI7RSiccMaQfR8W6vR_H4m_HoceqMhx8,5758
2693
+ esphome/components/speaker/media_player/speaker_media_player.cpp,sha256=CGytXDR9vWYAcm8Gta-qAfZibGgAa2kLNr6p_419Cpk,21569
2694
+ esphome/components/speaker/media_player/speaker_media_player.h,sha256=wteJb_rXEK2LUTdehGsAMldDl0KLWpP8aySHsPYIIDc,5533
2695
2695
  esphome/components/speed/__init__.py,sha256=Bfyz1MHHvLHj93TfN53E2uhKXKLYtp0k4st6Xb3760o,74
2696
2696
  esphome/components/speed/fan/__init__.py,sha256=zhurjCYLG9V-soV-LF4mEGxqyrcQuQ_KLdFq0LpyAKA,1798
2697
2697
  esphome/components/speed/fan/speed_fan.cpp,sha256=vjrhZZ4Rto6uEmw8396tF9QrAXZvZSKKiIC-_T2LtYc,1472
@@ -3474,9 +3474,9 @@ esphome/dashboard/util/itertools.py,sha256=8eLrWEWmICLtXNxkKdYPQV0c_N4GEz8m9Npnb
3474
3474
  esphome/dashboard/util/password.py,sha256=cQz3b9B-ijTe7zS6BeCW0hc3pWv6JjC78jmnycYYAh8,321
3475
3475
  esphome/dashboard/util/subprocess.py,sha256=T8EW6dbU4LPd2DG1dRrdh8li71tt6J1isn411poMhkk,1022
3476
3476
  esphome/dashboard/util/text.py,sha256=ENDnfN4O0NdA3CKVJjQYabFbwbrsIhVKrAMQe53qYu4,534
3477
- esphome-2025.3.1.dist-info/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3478
- esphome-2025.3.1.dist-info/METADATA,sha256=CwwM_TlOJ86BSoNW80T3-5088bU4a_ElSaJs1_FtJe4,3689
3479
- esphome-2025.3.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
3480
- esphome-2025.3.1.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3481
- esphome-2025.3.1.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3482
- esphome-2025.3.1.dist-info/RECORD,,
3477
+ esphome-2025.3.2.dist-info/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3478
+ esphome-2025.3.2.dist-info/METADATA,sha256=v8Q7uCTovNLcVG6epNDDfKd7kGnQCibWu-8HZV0-w98,3689
3479
+ esphome-2025.3.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
3480
+ esphome-2025.3.2.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3481
+ esphome-2025.3.2.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3482
+ esphome-2025.3.2.dist-info/RECORD,,