esphome 2025.5.0b6__py3-none-any.whl → 2025.5.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- esphome/components/api/api_connection.cpp +6 -2
- esphome/components/debug/debug_component.cpp +0 -4
- esphome/components/esp32/core.cpp +8 -1
- esphome/components/esp8266/gpio.cpp +10 -1
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +53 -63
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -0
- esphome/components/logger/__init__.py +2 -0
- esphome/components/logger/logger.h +4 -4
- esphome/components/logger/select/__init__.py +5 -4
- esphome/components/lvgl/schemas.py +34 -20
- esphome/components/micro_wake_word/streaming_model.cpp +5 -1
- esphome/components/online_image/__init__.py +1 -1
- esphome/components/online_image/png_image.cpp +21 -1
- esphome/components/online_image/png_image.h +5 -3
- esphome/components/rp2040/gpio.cpp +26 -9
- esphome/components/speaker/media_player/audio_pipeline.cpp +10 -10
- esphome/components/tuya/select/__init__.py +2 -2
- esphome/const.py +1 -1
- esphome/core/hal.h +5 -0
- esphome/core/helpers.h +1 -0
- esphome/core/string_ref.h +1 -0
- esphome/dashboard/web_server.py +12 -7
- {esphome-2025.5.0b6.dist-info → esphome-2025.5.2.dist-info}/METADATA +1 -1
- {esphome-2025.5.0b6.dist-info → esphome-2025.5.2.dist-info}/RECORD +28 -28
- {esphome-2025.5.0b6.dist-info → esphome-2025.5.2.dist-info}/WHEEL +0 -0
- {esphome-2025.5.0b6.dist-info → esphome-2025.5.2.dist-info}/entry_points.txt +0 -0
- {esphome-2025.5.0b6.dist-info → esphome-2025.5.2.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.5.0b6.dist-info → esphome-2025.5.2.dist-info}/top_level.txt +0 -0
@@ -4,11 +4,11 @@
|
|
4
4
|
#include <cinttypes>
|
5
5
|
#include <utility>
|
6
6
|
#include "esphome/components/network/util.h"
|
7
|
+
#include "esphome/core/application.h"
|
7
8
|
#include "esphome/core/entity_base.h"
|
8
9
|
#include "esphome/core/hal.h"
|
9
10
|
#include "esphome/core/log.h"
|
10
11
|
#include "esphome/core/version.h"
|
11
|
-
#include "esphome/core/application.h"
|
12
12
|
|
13
13
|
#ifdef USE_DEEP_SLEEP
|
14
14
|
#include "esphome/components/deep_sleep/deep_sleep_component.h"
|
@@ -153,7 +153,11 @@ void APIConnection::loop() {
|
|
153
153
|
} else {
|
154
154
|
this->last_traffic_ = App.get_loop_component_start_time();
|
155
155
|
// read a packet
|
156
|
-
|
156
|
+
if (buffer.data_len > 0) {
|
157
|
+
this->read_message(buffer.data_len, buffer.type, &buffer.container[buffer.data_offset]);
|
158
|
+
} else {
|
159
|
+
this->read_message(0, buffer.type, nullptr);
|
160
|
+
}
|
157
161
|
if (this->remove_)
|
158
162
|
return;
|
159
163
|
}
|
@@ -15,10 +15,6 @@ namespace debug {
|
|
15
15
|
static const char *const TAG = "debug";
|
16
16
|
|
17
17
|
void DebugComponent::dump_config() {
|
18
|
-
#ifndef ESPHOME_LOG_HAS_DEBUG
|
19
|
-
return; // Can't log below if debug logging is disabled
|
20
|
-
#endif
|
21
|
-
|
22
18
|
ESP_LOGCONFIG(TAG, "Debug component:");
|
23
19
|
#ifdef USE_TEXT_SENSOR
|
24
20
|
LOG_TEXT_SENSOR(" ", "Device info", this->device_info_);
|
@@ -15,8 +15,9 @@
|
|
15
15
|
#ifdef USE_ARDUINO
|
16
16
|
#include <Esp.h>
|
17
17
|
#else
|
18
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0)
|
18
19
|
#include <esp_clk_tree.h>
|
19
|
-
|
20
|
+
#endif
|
20
21
|
void setup();
|
21
22
|
void loop();
|
22
23
|
#endif
|
@@ -63,7 +64,13 @@ uint32_t arch_get_cpu_cycle_count() { return cpu_hal_get_cycle_count(); }
|
|
63
64
|
uint32_t arch_get_cpu_freq_hz() {
|
64
65
|
uint32_t freq = 0;
|
65
66
|
#ifdef USE_ESP_IDF
|
67
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0)
|
66
68
|
esp_clk_tree_src_get_freq_hz(SOC_MOD_CLK_CPU, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &freq);
|
69
|
+
#else
|
70
|
+
rtc_cpu_freq_config_t config;
|
71
|
+
rtc_clk_cpu_freq_get_config(&config);
|
72
|
+
freq = config.freq_mhz * 1000000U;
|
73
|
+
#endif
|
67
74
|
#elif defined(USE_ARDUINO)
|
68
75
|
freq = ESP.getCpuFreqMHz() * 1000000;
|
69
76
|
#endif
|
@@ -40,6 +40,7 @@ struct ISRPinArg {
|
|
40
40
|
volatile uint32_t *mode_set_reg;
|
41
41
|
volatile uint32_t *mode_clr_reg;
|
42
42
|
volatile uint32_t *func_reg;
|
43
|
+
volatile uint32_t *control_reg;
|
43
44
|
uint32_t mask;
|
44
45
|
};
|
45
46
|
|
@@ -54,6 +55,7 @@ ISRInternalGPIOPin ESP8266GPIOPin::to_isr() const {
|
|
54
55
|
arg->mode_set_reg = &GPES;
|
55
56
|
arg->mode_clr_reg = &GPEC;
|
56
57
|
arg->func_reg = &GPF(this->pin_);
|
58
|
+
arg->control_reg = &GPC(this->pin_);
|
57
59
|
arg->mask = 1 << this->pin_;
|
58
60
|
} else {
|
59
61
|
arg->in_reg = &GP16I;
|
@@ -62,6 +64,7 @@ ISRInternalGPIOPin ESP8266GPIOPin::to_isr() const {
|
|
62
64
|
arg->mode_set_reg = &GP16E;
|
63
65
|
arg->mode_clr_reg = nullptr;
|
64
66
|
arg->func_reg = &GPF16;
|
67
|
+
arg->control_reg = nullptr;
|
65
68
|
arg->mask = 1;
|
66
69
|
}
|
67
70
|
return ISRInternalGPIOPin((void *) arg);
|
@@ -143,11 +146,17 @@ void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) {
|
|
143
146
|
if (arg->pin < 16) {
|
144
147
|
if (flags & gpio::FLAG_OUTPUT) {
|
145
148
|
*arg->mode_set_reg = arg->mask;
|
146
|
-
|
149
|
+
if (flags & gpio::FLAG_OPEN_DRAIN) {
|
150
|
+
*arg->control_reg |= 1 << GPCD;
|
151
|
+
} else {
|
152
|
+
*arg->control_reg &= ~(1 << GPCD);
|
153
|
+
}
|
154
|
+
} else if (flags & gpio::FLAG_INPUT) {
|
147
155
|
*arg->mode_clr_reg = arg->mask;
|
148
156
|
}
|
149
157
|
if (flags & gpio::FLAG_PULLUP) {
|
150
158
|
*arg->func_reg |= 1 << GPFPU;
|
159
|
+
*arg->control_reg |= 1 << GPCD;
|
151
160
|
} else {
|
152
161
|
*arg->func_reg &= ~(1 << GPFPU);
|
153
162
|
}
|
@@ -30,11 +30,11 @@ static const int32_t DC_OFFSET_MOVING_AVERAGE_COEFFICIENT_DENOMINATOR = 1000;
|
|
30
30
|
static const char *const TAG = "i2s_audio.microphone";
|
31
31
|
|
32
32
|
enum MicrophoneEventGroupBits : uint32_t {
|
33
|
-
COMMAND_STOP = (1 << 0), // stops the microphone task
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
TASK_STOPPED = (1 << 13),
|
33
|
+
COMMAND_STOP = (1 << 0), // stops the microphone task, set and cleared by ``loop``
|
34
|
+
|
35
|
+
TASK_STARTING = (1 << 10), // set by mic task, cleared by ``loop``
|
36
|
+
TASK_RUNNING = (1 << 11), // set by mic task, cleared by ``loop``
|
37
|
+
TASK_STOPPED = (1 << 13), // set by mic task, cleared by ``loop``
|
38
38
|
|
39
39
|
ALL_BITS = 0x00FFFFFF, // All valid FreeRTOS event group bits
|
40
40
|
};
|
@@ -151,24 +151,21 @@ bool I2SAudioMicrophone::start_driver_() {
|
|
151
151
|
config.mode = (i2s_mode_t) (config.mode | I2S_MODE_ADC_BUILT_IN);
|
152
152
|
err = i2s_driver_install(this->parent_->get_port(), &config, 0, nullptr);
|
153
153
|
if (err != ESP_OK) {
|
154
|
-
|
155
|
-
this->status_set_error();
|
154
|
+
ESP_LOGE(TAG, "Error installing I2S driver: %s", esp_err_to_name(err));
|
156
155
|
return false;
|
157
156
|
}
|
158
157
|
|
159
158
|
err = i2s_set_adc_mode(ADC_UNIT_1, this->adc_channel_);
|
160
159
|
if (err != ESP_OK) {
|
161
|
-
|
162
|
-
this->status_set_error();
|
160
|
+
ESP_LOGE(TAG, "Error setting ADC mode: %s", esp_err_to_name(err));
|
163
161
|
return false;
|
164
162
|
}
|
163
|
+
|
165
164
|
err = i2s_adc_enable(this->parent_->get_port());
|
166
165
|
if (err != ESP_OK) {
|
167
|
-
|
168
|
-
this->status_set_error();
|
166
|
+
ESP_LOGE(TAG, "Error enabling ADC: %s", esp_err_to_name(err));
|
169
167
|
return false;
|
170
168
|
}
|
171
|
-
|
172
169
|
} else
|
173
170
|
#endif
|
174
171
|
{
|
@@ -177,8 +174,7 @@ bool I2SAudioMicrophone::start_driver_() {
|
|
177
174
|
|
178
175
|
err = i2s_driver_install(this->parent_->get_port(), &config, 0, nullptr);
|
179
176
|
if (err != ESP_OK) {
|
180
|
-
|
181
|
-
this->status_set_error();
|
177
|
+
ESP_LOGE(TAG, "Error installing I2S driver: %s", esp_err_to_name(err));
|
182
178
|
return false;
|
183
179
|
}
|
184
180
|
|
@@ -187,8 +183,7 @@ bool I2SAudioMicrophone::start_driver_() {
|
|
187
183
|
|
188
184
|
err = i2s_set_pin(this->parent_->get_port(), &pin_config);
|
189
185
|
if (err != ESP_OK) {
|
190
|
-
|
191
|
-
this->status_set_error();
|
186
|
+
ESP_LOGE(TAG, "Error setting I2S pin: %s", esp_err_to_name(err));
|
192
187
|
return false;
|
193
188
|
}
|
194
189
|
}
|
@@ -203,8 +198,7 @@ bool I2SAudioMicrophone::start_driver_() {
|
|
203
198
|
/* Allocate a new RX channel and get the handle of this channel */
|
204
199
|
err = i2s_new_channel(&chan_cfg, NULL, &this->rx_handle_);
|
205
200
|
if (err != ESP_OK) {
|
206
|
-
|
207
|
-
this->status_set_error();
|
201
|
+
ESP_LOGE(TAG, "Error creating new I2S channel: %s", esp_err_to_name(err));
|
208
202
|
return false;
|
209
203
|
}
|
210
204
|
|
@@ -276,22 +270,20 @@ bool I2SAudioMicrophone::start_driver_() {
|
|
276
270
|
err = i2s_channel_init_std_mode(this->rx_handle_, &std_cfg);
|
277
271
|
}
|
278
272
|
if (err != ESP_OK) {
|
279
|
-
|
280
|
-
this->status_set_error();
|
273
|
+
ESP_LOGE(TAG, "Error initializing I2S channel: %s", esp_err_to_name(err));
|
281
274
|
return false;
|
282
275
|
}
|
283
276
|
|
284
277
|
/* Before reading data, start the RX channel first */
|
285
278
|
i2s_channel_enable(this->rx_handle_);
|
286
279
|
if (err != ESP_OK) {
|
287
|
-
|
288
|
-
this->status_set_error();
|
280
|
+
ESP_LOGE(TAG, "Error enabling I2S Microphone: %s", esp_err_to_name(err));
|
289
281
|
return false;
|
290
282
|
}
|
291
283
|
#endif
|
292
284
|
|
293
|
-
this->status_clear_error();
|
294
285
|
this->configure_stream_settings_(); // redetermine the settings in case some settings were changed after compilation
|
286
|
+
|
295
287
|
return true;
|
296
288
|
}
|
297
289
|
|
@@ -303,71 +295,55 @@ void I2SAudioMicrophone::stop() {
|
|
303
295
|
}
|
304
296
|
|
305
297
|
void I2SAudioMicrophone::stop_driver_() {
|
298
|
+
// There is no harm continuing to unload the driver if an error is ever returned by the various functions. This
|
299
|
+
// ensures that we stop/unload the driver when it only partially starts.
|
300
|
+
|
306
301
|
esp_err_t err;
|
307
302
|
#ifdef USE_I2S_LEGACY
|
308
303
|
#if SOC_I2S_SUPPORTS_ADC
|
309
304
|
if (this->adc_) {
|
310
305
|
err = i2s_adc_disable(this->parent_->get_port());
|
311
306
|
if (err != ESP_OK) {
|
312
|
-
ESP_LOGW(TAG, "Error disabling ADC: %s", esp_err_to_name(err));
|
313
|
-
this->status_set_error();
|
314
|
-
return;
|
307
|
+
ESP_LOGW(TAG, "Error disabling ADC - it may not have started: %s", esp_err_to_name(err));
|
315
308
|
}
|
316
309
|
}
|
317
310
|
#endif
|
318
311
|
err = i2s_stop(this->parent_->get_port());
|
319
312
|
if (err != ESP_OK) {
|
320
|
-
ESP_LOGW(TAG, "Error stopping I2S microphone: %s", esp_err_to_name(err));
|
321
|
-
this->status_set_error();
|
322
|
-
return;
|
313
|
+
ESP_LOGW(TAG, "Error stopping I2S microphone - it may not have started: %s", esp_err_to_name(err));
|
323
314
|
}
|
324
315
|
err = i2s_driver_uninstall(this->parent_->get_port());
|
325
316
|
if (err != ESP_OK) {
|
326
|
-
ESP_LOGW(TAG, "Error uninstalling I2S driver: %s", esp_err_to_name(err));
|
327
|
-
this->status_set_error();
|
328
|
-
return;
|
317
|
+
ESP_LOGW(TAG, "Error uninstalling I2S driver - it may not have started: %s", esp_err_to_name(err));
|
329
318
|
}
|
330
319
|
#else
|
331
320
|
/* Have to stop the channel before deleting it */
|
332
321
|
err = i2s_channel_disable(this->rx_handle_);
|
333
322
|
if (err != ESP_OK) {
|
334
|
-
ESP_LOGW(TAG, "Error stopping I2S microphone: %s", esp_err_to_name(err));
|
335
|
-
this->status_set_error();
|
336
|
-
return;
|
323
|
+
ESP_LOGW(TAG, "Error stopping I2S microphone - it may not have started: %s", esp_err_to_name(err));
|
337
324
|
}
|
338
325
|
/* If the handle is not needed any more, delete it to release the channel resources */
|
339
326
|
err = i2s_del_channel(this->rx_handle_);
|
340
327
|
if (err != ESP_OK) {
|
341
|
-
ESP_LOGW(TAG, "Error deleting I2S channel: %s", esp_err_to_name(err));
|
342
|
-
this->status_set_error();
|
343
|
-
return;
|
328
|
+
ESP_LOGW(TAG, "Error deleting I2S channel - it may not have started: %s", esp_err_to_name(err));
|
344
329
|
}
|
345
330
|
#endif
|
346
331
|
this->parent_->unlock();
|
347
|
-
this->status_clear_error();
|
348
332
|
}
|
349
333
|
|
350
334
|
void I2SAudioMicrophone::mic_task(void *params) {
|
351
335
|
I2SAudioMicrophone *this_microphone = (I2SAudioMicrophone *) params;
|
352
|
-
|
353
336
|
xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_STARTING);
|
354
337
|
|
355
|
-
|
356
|
-
bool started = this_microphone->start_driver_();
|
357
|
-
while (!started && start_counter < 10) {
|
358
|
-
// Attempt to load the driver again in 100 ms. Doesn't slow down main loop since its in a task.
|
359
|
-
vTaskDelay(pdMS_TO_TICKS(100));
|
360
|
-
++start_counter;
|
361
|
-
started = this_microphone->start_driver_();
|
362
|
-
}
|
338
|
+
{ // Ensures the samples vector is freed when the task stops
|
363
339
|
|
364
|
-
if (started) {
|
365
|
-
xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_RUNNING);
|
366
340
|
const size_t bytes_to_read = this_microphone->audio_stream_info_.ms_to_bytes(READ_DURATION_MS);
|
367
341
|
std::vector<uint8_t> samples;
|
368
342
|
samples.reserve(bytes_to_read);
|
369
343
|
|
370
|
-
|
344
|
+
xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_RUNNING);
|
345
|
+
|
346
|
+
while (!(xEventGroupGetBits(this_microphone->event_group_) & MicrophoneEventGroupBits::COMMAND_STOP)) {
|
371
347
|
if (this_microphone->data_callbacks_.size() > 0) {
|
372
348
|
samples.resize(bytes_to_read);
|
373
349
|
size_t bytes_read = this_microphone->read_(samples.data(), bytes_to_read, 2 * pdMS_TO_TICKS(READ_DURATION_MS));
|
@@ -382,9 +358,6 @@ void I2SAudioMicrophone::mic_task(void *params) {
|
|
382
358
|
}
|
383
359
|
}
|
384
360
|
|
385
|
-
xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_STOPPING);
|
386
|
-
this_microphone->stop_driver_();
|
387
|
-
|
388
361
|
xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_STOPPED);
|
389
362
|
while (true) {
|
390
363
|
// Continuously delay until the loop method deletes the task
|
@@ -425,7 +398,10 @@ size_t I2SAudioMicrophone::read_(uint8_t *buf, size_t len, TickType_t ticks_to_w
|
|
425
398
|
#endif
|
426
399
|
if ((err != ESP_OK) && ((err != ESP_ERR_TIMEOUT) || (ticks_to_wait != 0))) {
|
427
400
|
// Ignore ESP_ERR_TIMEOUT if ticks_to_wait = 0, as it will read the data on the next call
|
428
|
-
|
401
|
+
if (!this->status_has_warning()) {
|
402
|
+
// Avoid spamming the logs with the error message if its repeated
|
403
|
+
ESP_LOGW(TAG, "Error reading from I2S microphone: %s", esp_err_to_name(err));
|
404
|
+
}
|
429
405
|
this->status_set_warning();
|
430
406
|
return 0;
|
431
407
|
}
|
@@ -452,7 +428,7 @@ void I2SAudioMicrophone::loop() {
|
|
452
428
|
uint32_t event_group_bits = xEventGroupGetBits(this->event_group_);
|
453
429
|
|
454
430
|
if (event_group_bits & MicrophoneEventGroupBits::TASK_STARTING) {
|
455
|
-
ESP_LOGD(TAG, "Task
|
431
|
+
ESP_LOGD(TAG, "Task started, attempting to allocate buffer");
|
456
432
|
xEventGroupClearBits(this->event_group_, MicrophoneEventGroupBits::TASK_STARTING);
|
457
433
|
}
|
458
434
|
|
@@ -463,23 +439,25 @@ void I2SAudioMicrophone::loop() {
|
|
463
439
|
this->state_ = microphone::STATE_RUNNING;
|
464
440
|
}
|
465
441
|
|
466
|
-
if (event_group_bits & MicrophoneEventGroupBits::TASK_STOPPING) {
|
467
|
-
ESP_LOGD(TAG, "Task is stopping, attempting to unload the I2S audio driver");
|
468
|
-
xEventGroupClearBits(this->event_group_, MicrophoneEventGroupBits::TASK_STOPPING);
|
469
|
-
}
|
470
|
-
|
471
442
|
if ((event_group_bits & MicrophoneEventGroupBits::TASK_STOPPED)) {
|
472
|
-
ESP_LOGD(TAG, "Task
|
443
|
+
ESP_LOGD(TAG, "Task finished, freeing resources and uninstalling I2S driver");
|
444
|
+
|
473
445
|
vTaskDelete(this->task_handle_);
|
474
446
|
this->task_handle_ = nullptr;
|
447
|
+
this->stop_driver_();
|
475
448
|
xEventGroupClearBits(this->event_group_, ALL_BITS);
|
449
|
+
this->status_clear_error();
|
450
|
+
|
476
451
|
this->state_ = microphone::STATE_STOPPED;
|
477
452
|
}
|
478
453
|
|
454
|
+
// Start the microphone if any semaphores are taken
|
479
455
|
if ((uxSemaphoreGetCount(this->active_listeners_semaphore_) < MAX_LISTENERS) &&
|
480
456
|
(this->state_ == microphone::STATE_STOPPED)) {
|
481
457
|
this->state_ = microphone::STATE_STARTING;
|
482
458
|
}
|
459
|
+
|
460
|
+
// Stop the microphone if all semaphores are returned
|
483
461
|
if ((uxSemaphoreGetCount(this->active_listeners_semaphore_) == MAX_LISTENERS) &&
|
484
462
|
(this->state_ == microphone::STATE_RUNNING)) {
|
485
463
|
this->state_ = microphone::STATE_STOPPING;
|
@@ -487,14 +465,26 @@ void I2SAudioMicrophone::loop() {
|
|
487
465
|
|
488
466
|
switch (this->state_) {
|
489
467
|
case microphone::STATE_STARTING:
|
490
|
-
if (
|
468
|
+
if (this->status_has_error()) {
|
469
|
+
break;
|
470
|
+
}
|
471
|
+
|
472
|
+
if (!this->start_driver_()) {
|
473
|
+
this->status_momentary_error("I2S driver failed to start, unloading it and attempting again in 1 second", 1000);
|
474
|
+
this->stop_driver_(); // Stop/frees whatever possibly started
|
475
|
+
break;
|
476
|
+
}
|
477
|
+
|
478
|
+
if (this->task_handle_ == nullptr) {
|
491
479
|
xTaskCreate(I2SAudioMicrophone::mic_task, "mic_task", TASK_STACK_SIZE, (void *) this, TASK_PRIORITY,
|
492
480
|
&this->task_handle_);
|
493
481
|
|
494
482
|
if (this->task_handle_ == nullptr) {
|
495
483
|
this->status_momentary_error("Task failed to start, attempting again in 1 second", 1000);
|
484
|
+
this->stop_driver_(); // Stops the driver to return the lock; will be reloaded in next attempt
|
496
485
|
}
|
497
486
|
}
|
487
|
+
|
498
488
|
break;
|
499
489
|
case microphone::STATE_RUNNING:
|
500
490
|
break;
|
@@ -43,7 +43,11 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub
|
|
43
43
|
#endif
|
44
44
|
|
45
45
|
protected:
|
46
|
+
/// @brief Starts the I2S driver. Updates the ``audio_stream_info_`` member variable with the current setttings.
|
47
|
+
/// @return True if succesful, false otherwise
|
46
48
|
bool start_driver_();
|
49
|
+
|
50
|
+
/// @brief Stops the I2S driver.
|
47
51
|
void stop_driver_();
|
48
52
|
|
49
53
|
/// @brief Attempts to correct a microphone DC offset; e.g., a microphones silent level is offset from 0. Applies a
|
@@ -24,6 +24,7 @@ from esphome.const import (
|
|
24
24
|
CONF_HARDWARE_UART,
|
25
25
|
CONF_ID,
|
26
26
|
CONF_LEVEL,
|
27
|
+
CONF_LOGGER,
|
27
28
|
CONF_LOGS,
|
28
29
|
CONF_ON_MESSAGE,
|
29
30
|
CONF_TAG,
|
@@ -247,6 +248,7 @@ CONFIG_SCHEMA = cv.All(
|
|
247
248
|
async def to_code(config):
|
248
249
|
baud_rate = config[CONF_BAUD_RATE]
|
249
250
|
level = config[CONF_LEVEL]
|
251
|
+
CORE.data.setdefault(CONF_LOGGER, {})[CONF_LEVEL] = level
|
250
252
|
initial_level = LOG_LEVELS[config.get(CONF_INITIAL_LEVEL, level)]
|
251
253
|
log = cg.new_Pvariable(
|
252
254
|
config[CONF_ID],
|
@@ -212,9 +212,9 @@ class Logger : public Component {
|
|
212
212
|
}
|
213
213
|
|
214
214
|
// Format string to explicit buffer with varargs
|
215
|
-
inline void printf_to_buffer_(
|
215
|
+
inline void printf_to_buffer_(char *buffer, int *buffer_at, int buffer_size, const char *format, ...) {
|
216
216
|
va_list arg;
|
217
|
-
va_start(arg,
|
217
|
+
va_start(arg, format);
|
218
218
|
this->format_body_to_buffer_(buffer, buffer_at, buffer_size, format, arg);
|
219
219
|
va_end(arg);
|
220
220
|
}
|
@@ -312,13 +312,13 @@ class Logger : public Component {
|
|
312
312
|
#if defined(USE_ESP32) || defined(USE_LIBRETINY)
|
313
313
|
if (thread_name != nullptr) {
|
314
314
|
// Non-main task with thread name
|
315
|
-
this->printf_to_buffer_("%s[%s][%s:%03u]%s[%s]%s: ",
|
315
|
+
this->printf_to_buffer_(buffer, buffer_at, buffer_size, "%s[%s][%s:%03u]%s[%s]%s: ", color, letter, tag, line,
|
316
316
|
ESPHOME_LOG_BOLD(ESPHOME_LOG_COLOR_RED), thread_name, color);
|
317
317
|
return;
|
318
318
|
}
|
319
319
|
#endif
|
320
320
|
// Main task or non ESP32/LibreTiny platform
|
321
|
-
this->printf_to_buffer_("%s[%s][%s:%03u]: ",
|
321
|
+
this->printf_to_buffer_(buffer, buffer_at, buffer_size, "%s[%s][%s:%03u]: ", color, letter, tag, line);
|
322
322
|
}
|
323
323
|
|
324
324
|
inline void HOT format_body_to_buffer_(char *buffer, int *buffer_at, int buffer_size, const char *format,
|
@@ -5,7 +5,7 @@ from esphome.const import CONF_LEVEL, CONF_LOGGER, ENTITY_CATEGORY_CONFIG, ICON_
|
|
5
5
|
from esphome.core import CORE
|
6
6
|
from esphome.cpp_helpers import register_component, register_parented
|
7
7
|
|
8
|
-
from .. import CONF_LOGGER_ID,
|
8
|
+
from .. import CONF_LOGGER_ID, LOG_LEVELS, Logger, logger_ns
|
9
9
|
|
10
10
|
CODEOWNERS = ["@clydebarrow"]
|
11
11
|
|
@@ -21,9 +21,10 @@ CONFIG_SCHEMA = select.select_schema(
|
|
21
21
|
|
22
22
|
|
23
23
|
async def to_code(config):
|
24
|
-
|
25
|
-
|
24
|
+
parent = await cg.get_variable(config[CONF_LOGGER_ID])
|
25
|
+
levels = list(LOG_LEVELS)
|
26
|
+
index = levels.index(CORE.data[CONF_LOGGER][CONF_LEVEL])
|
26
27
|
levels = levels[: index + 1]
|
27
28
|
var = await select.new_select(config, options=levels)
|
28
|
-
await register_parented(var,
|
29
|
+
await register_parented(var, parent)
|
29
30
|
await register_component(var, config)
|
@@ -36,29 +36,43 @@ from .types import (
|
|
36
36
|
# this will be populated later, in __init__.py to avoid circular imports.
|
37
37
|
WIDGET_TYPES: dict = {}
|
38
38
|
|
39
|
+
TIME_TEXT_SCHEMA = cv.Schema(
|
40
|
+
{
|
41
|
+
cv.Required(CONF_TIME_FORMAT): cv.string,
|
42
|
+
cv.GenerateID(CONF_TIME): cv.templatable(cv.use_id(RealTimeClock)),
|
43
|
+
}
|
44
|
+
)
|
45
|
+
|
46
|
+
PRINTF_TEXT_SCHEMA = cv.All(
|
47
|
+
cv.Schema(
|
48
|
+
{
|
49
|
+
cv.Required(CONF_FORMAT): cv.string,
|
50
|
+
cv.Optional(CONF_ARGS, default=list): cv.ensure_list(cv.lambda_),
|
51
|
+
},
|
52
|
+
),
|
53
|
+
validate_printf,
|
54
|
+
)
|
55
|
+
|
56
|
+
|
57
|
+
def _validate_text(value):
|
58
|
+
"""
|
59
|
+
Do some sanity checking of the format to get better error messages
|
60
|
+
than using cv.Any
|
61
|
+
"""
|
62
|
+
if value is None:
|
63
|
+
raise cv.Invalid("No text specified")
|
64
|
+
if isinstance(value, dict):
|
65
|
+
if CONF_TIME_FORMAT in value:
|
66
|
+
return TIME_TEXT_SCHEMA(value)
|
67
|
+
return PRINTF_TEXT_SCHEMA(value)
|
68
|
+
|
69
|
+
return cv.templatable(cv.string)(value)
|
70
|
+
|
71
|
+
|
39
72
|
# A schema for text properties
|
40
73
|
TEXT_SCHEMA = cv.Schema(
|
41
74
|
{
|
42
|
-
cv.Optional(CONF_TEXT):
|
43
|
-
cv.All(
|
44
|
-
cv.Schema(
|
45
|
-
{
|
46
|
-
cv.Required(CONF_FORMAT): cv.string,
|
47
|
-
cv.Optional(CONF_ARGS, default=list): cv.ensure_list(
|
48
|
-
cv.lambda_
|
49
|
-
),
|
50
|
-
},
|
51
|
-
),
|
52
|
-
validate_printf,
|
53
|
-
),
|
54
|
-
cv.Schema(
|
55
|
-
{
|
56
|
-
cv.Required(CONF_TIME_FORMAT): cv.string,
|
57
|
-
cv.GenerateID(CONF_TIME): cv.templatable(cv.use_id(RealTimeClock)),
|
58
|
-
}
|
59
|
-
),
|
60
|
-
cv.templatable(cv.string),
|
61
|
-
)
|
75
|
+
cv.Optional(CONF_TEXT): _validate_text,
|
62
76
|
}
|
63
77
|
)
|
64
78
|
|
@@ -147,7 +147,11 @@ bool StreamingModel::perform_streaming_inference(const int8_t features[PREPROCES
|
|
147
147
|
this->recent_streaming_probabilities_[this->last_n_index_] = output->data.uint8[0]; // probability;
|
148
148
|
this->unprocessed_probability_status_ = true;
|
149
149
|
}
|
150
|
-
this->
|
150
|
+
if (this->recent_streaming_probabilities_[this->last_n_index_] < this->probability_cutoff_) {
|
151
|
+
// Only increment ignore windows if less than the probability cutoff; this forces the model to "cool-off" from a
|
152
|
+
// previous detection and calling ``reset_probabilities`` so it avoids duplicate detections
|
153
|
+
this->ignore_windows_ = std::min(this->ignore_windows_ + 1, 0);
|
154
|
+
}
|
151
155
|
}
|
152
156
|
return true;
|
153
157
|
}
|
@@ -34,12 +34,32 @@ static void init_callback(pngle_t *pngle, uint32_t w, uint32_t h) {
|
|
34
34
|
* @param h The height of the rectangle to draw.
|
35
35
|
* @param rgba The color to paint the rectangle in.
|
36
36
|
*/
|
37
|
-
static void draw_callback(pngle_t *pngle, uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint8_t rgba[4]) {
|
37
|
+
static void draw_callback(pngle_t *pngle, uint32_t x, uint32_t y, uint32_t w, uint32_t h, const uint8_t rgba[4]) {
|
38
38
|
PngDecoder *decoder = (PngDecoder *) pngle_get_user_data(pngle);
|
39
39
|
Color color(rgba[0], rgba[1], rgba[2], rgba[3]);
|
40
40
|
decoder->draw(x, y, w, h, color);
|
41
41
|
}
|
42
42
|
|
43
|
+
PngDecoder::PngDecoder(OnlineImage *image) : ImageDecoder(image) {
|
44
|
+
{
|
45
|
+
pngle_t *pngle = this->allocator_.allocate(1, PNGLE_T_SIZE);
|
46
|
+
if (!pngle) {
|
47
|
+
ESP_LOGE(TAG, "Failed to allocate memory for PNGLE engine!");
|
48
|
+
return;
|
49
|
+
}
|
50
|
+
memset(pngle, 0, PNGLE_T_SIZE);
|
51
|
+
pngle_reset(pngle);
|
52
|
+
this->pngle_ = pngle;
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
PngDecoder::~PngDecoder() {
|
57
|
+
if (this->pngle_) {
|
58
|
+
pngle_reset(this->pngle_);
|
59
|
+
this->allocator_.deallocate(this->pngle_, PNGLE_T_SIZE);
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
43
63
|
int PngDecoder::prepare(size_t download_size) {
|
44
64
|
ImageDecoder::prepare(download_size);
|
45
65
|
if (!this->pngle_) {
|
@@ -1,7 +1,8 @@
|
|
1
1
|
#pragma once
|
2
2
|
|
3
|
-
#include "image_decoder.h"
|
4
3
|
#include "esphome/core/defines.h"
|
4
|
+
#include "esphome/core/helpers.h"
|
5
|
+
#include "image_decoder.h"
|
5
6
|
#ifdef USE_ONLINE_IMAGE_PNG_SUPPORT
|
6
7
|
#include <pngle.h>
|
7
8
|
|
@@ -18,13 +19,14 @@ class PngDecoder : public ImageDecoder {
|
|
18
19
|
*
|
19
20
|
* @param display The image to decode the stream into.
|
20
21
|
*/
|
21
|
-
PngDecoder(OnlineImage *image)
|
22
|
-
~PngDecoder() override
|
22
|
+
PngDecoder(OnlineImage *image);
|
23
|
+
~PngDecoder() override;
|
23
24
|
|
24
25
|
int prepare(size_t download_size) override;
|
25
26
|
int HOT decode(uint8_t *buffer, size_t size) override;
|
26
27
|
|
27
28
|
protected:
|
29
|
+
RAMAllocator<pngle_t> allocator_;
|
28
30
|
pngle_t *pngle_;
|
29
31
|
};
|
30
32
|
|
@@ -8,7 +8,7 @@ namespace rp2040 {
|
|
8
8
|
|
9
9
|
static const char *const TAG = "rp2040";
|
10
10
|
|
11
|
-
static int
|
11
|
+
static int flags_to_mode(gpio::Flags flags, uint8_t pin) {
|
12
12
|
if (flags == gpio::FLAG_INPUT) { // NOLINT(bugprone-branch-clone)
|
13
13
|
return INPUT;
|
14
14
|
} else if (flags == gpio::FLAG_OUTPUT) {
|
@@ -25,14 +25,16 @@ static int IRAM_ATTR flags_to_mode(gpio::Flags flags, uint8_t pin) {
|
|
25
25
|
}
|
26
26
|
|
27
27
|
struct ISRPinArg {
|
28
|
+
uint32_t mask;
|
28
29
|
uint8_t pin;
|
29
30
|
bool inverted;
|
30
31
|
};
|
31
32
|
|
32
33
|
ISRInternalGPIOPin RP2040GPIOPin::to_isr() const {
|
33
34
|
auto *arg = new ISRPinArg{}; // NOLINT(cppcoreguidelines-owning-memory)
|
34
|
-
arg->pin = pin_;
|
35
|
-
arg->inverted = inverted_;
|
35
|
+
arg->pin = this->pin_;
|
36
|
+
arg->inverted = this->inverted_;
|
37
|
+
arg->mask = 1 << this->pin_;
|
36
38
|
return ISRInternalGPIOPin((void *) arg);
|
37
39
|
}
|
38
40
|
|
@@ -81,21 +83,36 @@ void RP2040GPIOPin::detach_interrupt() const { detachInterrupt(pin_); }
|
|
81
83
|
using namespace rp2040;
|
82
84
|
|
83
85
|
bool IRAM_ATTR ISRInternalGPIOPin::digital_read() {
|
84
|
-
auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
|
85
|
-
return bool(
|
86
|
+
auto *arg = reinterpret_cast<ISRPinArg *>(this->arg_);
|
87
|
+
return bool(sio_hw->gpio_in & arg->mask) != arg->inverted;
|
86
88
|
}
|
89
|
+
|
87
90
|
void IRAM_ATTR ISRInternalGPIOPin::digital_write(bool value) {
|
88
|
-
auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
|
89
|
-
|
91
|
+
auto *arg = reinterpret_cast<ISRPinArg *>(this->arg_);
|
92
|
+
if (value != arg->inverted) {
|
93
|
+
sio_hw->gpio_set = arg->mask;
|
94
|
+
} else {
|
95
|
+
sio_hw->gpio_clr = arg->mask;
|
96
|
+
}
|
90
97
|
}
|
98
|
+
|
91
99
|
void IRAM_ATTR ISRInternalGPIOPin::clear_interrupt() {
|
92
100
|
// TODO: implement
|
93
101
|
// auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
|
94
102
|
// GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, 1UL << arg->pin);
|
95
103
|
}
|
104
|
+
|
96
105
|
void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) {
|
97
|
-
auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
|
98
|
-
|
106
|
+
auto *arg = reinterpret_cast<ISRPinArg *>(this->arg_);
|
107
|
+
if (flags & gpio::FLAG_OUTPUT) {
|
108
|
+
sio_hw->gpio_oe_set = arg->mask;
|
109
|
+
} else if (flags & gpio::FLAG_INPUT) {
|
110
|
+
sio_hw->gpio_oe_clr = arg->mask;
|
111
|
+
hw_write_masked(&padsbank0_hw->io[arg->pin],
|
112
|
+
(bool_to_bit(flags & gpio::FLAG_PULLUP) << PADS_BANK0_GPIO0_PUE_LSB) |
|
113
|
+
(bool_to_bit(flags & gpio::FLAG_PULLDOWN) << PADS_BANK0_GPIO0_PDE_LSB),
|
114
|
+
PADS_BANK0_GPIO0_PUE_BITS | PADS_BANK0_GPIO0_PDE_BITS);
|
115
|
+
}
|
99
116
|
}
|
100
117
|
|
101
118
|
} // namespace esphome
|
@@ -174,6 +174,16 @@ AudioPipelineState AudioPipeline::process_state() {
|
|
174
174
|
}
|
175
175
|
}
|
176
176
|
|
177
|
+
if ((event_bits & EventGroupBits::READER_MESSAGE_ERROR)) {
|
178
|
+
xEventGroupClearBits(this->event_group_, EventGroupBits::READER_MESSAGE_ERROR);
|
179
|
+
return AudioPipelineState::ERROR_READING;
|
180
|
+
}
|
181
|
+
|
182
|
+
if ((event_bits & EventGroupBits::DECODER_MESSAGE_ERROR)) {
|
183
|
+
xEventGroupClearBits(this->event_group_, EventGroupBits::DECODER_MESSAGE_ERROR);
|
184
|
+
return AudioPipelineState::ERROR_DECODING;
|
185
|
+
}
|
186
|
+
|
177
187
|
if ((event_bits & EventGroupBits::READER_MESSAGE_FINISHED) &&
|
178
188
|
(!(event_bits & EventGroupBits::READER_MESSAGE_LOADED_MEDIA_TYPE) &&
|
179
189
|
(event_bits & EventGroupBits::DECODER_MESSAGE_FINISHED))) {
|
@@ -203,16 +213,6 @@ AudioPipelineState AudioPipeline::process_state() {
|
|
203
213
|
return AudioPipelineState::STOPPED;
|
204
214
|
}
|
205
215
|
|
206
|
-
if ((event_bits & EventGroupBits::READER_MESSAGE_ERROR)) {
|
207
|
-
xEventGroupClearBits(this->event_group_, EventGroupBits::READER_MESSAGE_ERROR);
|
208
|
-
return AudioPipelineState::ERROR_READING;
|
209
|
-
}
|
210
|
-
|
211
|
-
if ((event_bits & EventGroupBits::DECODER_MESSAGE_ERROR)) {
|
212
|
-
xEventGroupClearBits(this->event_group_, EventGroupBits::DECODER_MESSAGE_ERROR);
|
213
|
-
return AudioPipelineState::ERROR_DECODING;
|
214
|
-
}
|
215
|
-
|
216
216
|
if (this->pause_state_) {
|
217
217
|
return AudioPipelineState::PAUSED;
|
218
218
|
}
|
@@ -54,8 +54,8 @@ async def to_code(config):
|
|
54
54
|
cg.add(var.set_select_mappings(list(options_map.keys())))
|
55
55
|
parent = await cg.get_variable(config[CONF_TUYA_ID])
|
56
56
|
cg.add(var.set_tuya_parent(parent))
|
57
|
-
if enum_datapoint := config.get(CONF_ENUM_DATAPOINT, None) is not None:
|
57
|
+
if (enum_datapoint := config.get(CONF_ENUM_DATAPOINT, None)) is not None:
|
58
58
|
cg.add(var.set_select_id(enum_datapoint, False))
|
59
|
-
if int_datapoint := config.get(CONF_INT_DATAPOINT, None) is not None:
|
59
|
+
if (int_datapoint := config.get(CONF_INT_DATAPOINT, None)) is not None:
|
60
60
|
cg.add(var.set_select_id(int_datapoint, True))
|
61
61
|
cg.add(var.set_optimistic(config[CONF_OPTIMISTIC]))
|
esphome/const.py
CHANGED
esphome/core/hal.h
CHANGED
esphome/core/helpers.h
CHANGED
esphome/core/string_ref.h
CHANGED
esphome/dashboard/web_server.py
CHANGED
@@ -601,10 +601,12 @@ class DownloadListRequestHandler(BaseHandler):
|
|
601
601
|
loop = asyncio.get_running_loop()
|
602
602
|
try:
|
603
603
|
downloads_json = await loop.run_in_executor(None, self._get, configuration)
|
604
|
-
except vol.Invalid:
|
604
|
+
except vol.Invalid as exc:
|
605
|
+
_LOGGER.exception("Error while fetching downloads", exc_info=exc)
|
605
606
|
self.send_error(404)
|
606
607
|
return
|
607
608
|
if downloads_json is None:
|
609
|
+
_LOGGER.error("Configuration %s not found", configuration)
|
608
610
|
self.send_error(404)
|
609
611
|
return
|
610
612
|
self.set_status(200)
|
@@ -618,14 +620,17 @@ class DownloadListRequestHandler(BaseHandler):
|
|
618
620
|
if storage_json is None:
|
619
621
|
return None
|
620
622
|
|
621
|
-
|
623
|
+
try:
|
624
|
+
config = yaml_util.load_yaml(settings.rel_path(configuration))
|
622
625
|
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
626
|
+
if const.CONF_EXTERNAL_COMPONENTS in config:
|
627
|
+
from esphome.components.external_components import (
|
628
|
+
do_external_components_pass,
|
629
|
+
)
|
627
630
|
|
628
|
-
|
631
|
+
do_external_components_pass(config)
|
632
|
+
except vol.Invalid:
|
633
|
+
_LOGGER.info("Could not parse `external_components`, skipping")
|
629
634
|
|
630
635
|
from esphome.components.esp32 import VARIANTS as ESP32_VARIANTS
|
631
636
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: esphome
|
3
|
-
Version: 2025.5.
|
3
|
+
Version: 2025.5.2
|
4
4
|
Summary: ESPHome is a system to configure your microcontrollers by simple yet powerful configuration files and control them remotely through Home Automation systems.
|
5
5
|
Author-email: The ESPHome Authors <esphome@openhomefoundation.org>
|
6
6
|
License: MIT
|
@@ -5,7 +5,7 @@ esphome/codegen.py,sha256=GePHUM7xdXb_Pil59SHVsXg2F4VBPgkH-Fz2PDX8Z54,1873
|
|
5
5
|
esphome/config.py,sha256=-SoMrYNlKL85sYK_t_UQXKEKm-xrZYhyRqwiUpBXyXE,39896
|
6
6
|
esphome/config_helpers.py,sha256=MKf_wzO35nn41FvigXE0iYKDslPgL2ruf8R-EPtTT2I,3256
|
7
7
|
esphome/config_validation.py,sha256=vEDw3u5jfyZbELimFLjTK5YuupBwKI8Np8HUo7oqpoo,61434
|
8
|
-
esphome/const.py,sha256=
|
8
|
+
esphome/const.py,sha256=nNM-1r_zEencdJk5_U17zc8N4Squb0F_Zo3FLL6g32U,41480
|
9
9
|
esphome/coroutine.py,sha256=j_14z8dIIzIBeuNO30D4c1RJvMMt1xZFZ58Evd-EvJA,9344
|
10
10
|
esphome/cpp_generator.py,sha256=39sLZ_f7UKrTOKKG5PVNQ6ucSRJFP0FYEhDN82DCO6Y,31377
|
11
11
|
esphome/cpp_helpers.py,sha256=6C2vNbOIhZKi43xRVlk5hp9GfshfBn-rc5D_ZFUEYaE,4801
|
@@ -182,7 +182,7 @@ esphome/components/apds9960/apds9960.h,sha256=oFrXPQrPDS16gNSVdN1n6SKuvjwc9LdvpK
|
|
182
182
|
esphome/components/apds9960/binary_sensor.py,sha256=MvCYb6pTgOU48TMm_YhN6uHKkoFKFvhma3lwQQD9xfM,787
|
183
183
|
esphome/components/apds9960/sensor.py,sha256=vUPm5H_IFROftGlMJWfgqSzm0IeLpYh5DvtA_DL1Amk,872
|
184
184
|
esphome/components/api/__init__.py,sha256=eDf1EuKrpeQ9bu3KDim5VvwDaAekzBGFXQJV50mPXf4,10459
|
185
|
-
esphome/components/api/api_connection.cpp,sha256=
|
185
|
+
esphome/components/api/api_connection.cpp,sha256=JTQC3LIV5VG8BbJDcGckbIed1gC8FhU5yKyN43nmtUc,69030
|
186
186
|
esphome/components/api/api_connection.h,sha256=JvnTtRbBOJatkjeAra--7MY72cQooeiYo7B3paOKhg4,21419
|
187
187
|
esphome/components/api/api_frame_helper.cpp,sha256=bFmRYeRiIXxyevKcziDvjKjI0ofvFT5-44U0Ux6zJDA,38336
|
188
188
|
esphome/components/api/api_frame_helper.h,sha256=TT3s7f4tWwhEJ9yhB2osU9R7f34MD8MO6EFAOeyq0Zk,8214
|
@@ -644,7 +644,7 @@ esphome/components/datetime/datetime_entity.h,sha256=qN4CuohdTVq5g0VKrl8whUE1FjF
|
|
644
644
|
esphome/components/datetime/time_entity.cpp,sha256=k9ZEtOs4SIO3GCwc-SmKExwYiiyDDqra5Lxw6b7fW2M,4403
|
645
645
|
esphome/components/datetime/time_entity.h,sha256=rNN9V8UH4ervs03lsuvR233dD13LYceAy597vXbURcY,2915
|
646
646
|
esphome/components/debug/__init__.py,sha256=llo39yz0GH4Lo10IIVJfwna6okFO4g4-L0D1dStlK5U,1463
|
647
|
-
esphome/components/debug/debug_component.cpp,sha256=
|
647
|
+
esphome/components/debug/debug_component.cpp,sha256=aW9jdJpsVBkPbAEyrRZJwKo_8hoAsGwUyazwikdinGs,3033
|
648
648
|
esphome/components/debug/debug_component.h,sha256=rhAbHVHngj9rtH33UDJ8Yg1CkxyS8iHlRAkDcvXqBcQ,3088
|
649
649
|
esphome/components/debug/debug_esp32.cpp,sha256=X3-yqAeneoLn5feAgnjxLhtFgm70QdTEY9QL7d-YhjY,7004
|
650
650
|
esphome/components/debug/debug_esp8266.cpp,sha256=eTj_cCcsHgG5YgtryxZFmM1bN2mHRXLEC1qPkfBDdDY,3145
|
@@ -799,7 +799,7 @@ esphome/components/es8311/es8311_const.h,sha256=bUBF4DJ28DcLPHznvh30Guewi65mSqQb
|
|
799
799
|
esphome/components/esp32/__init__.py,sha256=69TidRc1h15dsAP4Mrx7dnAJGpumJKsYr50Fc-kg25E,33238
|
800
800
|
esphome/components/esp32/boards.py,sha256=BSabIM_DaDXFkPvGemv_3mcqFgEUt2lAnxN5EFpCO9U,52725
|
801
801
|
esphome/components/esp32/const.py,sha256=2yxLQg3p2-S3nRL6-zsF_dICrP_6waUfY5k8EFsoyVM,966
|
802
|
-
esphome/components/esp32/core.cpp,sha256=
|
802
|
+
esphome/components/esp32/core.cpp,sha256=7O7S5bJPNUeX8ge1mxpyZ1WzxTf1fFDCRK3P5UxZvq8,2865
|
803
803
|
esphome/components/esp32/gpio.cpp,sha256=29SanxYKoiTw2sdn93X5Y0uigKJlhaApu6Jc-pJLXpY,6607
|
804
804
|
esphome/components/esp32/gpio.h,sha256=fIPLaMPSodwS4anI4DdOrWPee3pHR3GLHLSTlwPuRzY,1298
|
805
805
|
esphome/components/esp32/gpio.py,sha256=18VkjM_PA_Ux7jV_XG6HDLYGO9bj5vPUBTvU_rcP6GY,7229
|
@@ -886,7 +886,7 @@ esphome/components/esp8266/boards.py,sha256=p2btoDa36gfr9QsCOBZuME7Pi20Xf2LcQ_F-
|
|
886
886
|
esphome/components/esp8266/const.py,sha256=bBUPq-_hzl36vVhKwCxCI_2TSNLJZpwbs6MtgHLVATI,380
|
887
887
|
esphome/components/esp8266/core.cpp,sha256=IMhgyjd1a5Jm0j1wsUKcv6eme8A4_IdFdvPjX0QXNzE,2673
|
888
888
|
esphome/components/esp8266/core.h,sha256=Gt8v8q9LxxHbKjf445vOk1iYXnRYCl4VogI7sdUQuMM,287
|
889
|
-
esphome/components/esp8266/gpio.cpp,sha256=
|
889
|
+
esphome/components/esp8266/gpio.cpp,sha256=EEpDKxujguHbdMuCe9TtFAChmi6se8-Etumf6EkpuEI,4986
|
890
890
|
esphome/components/esp8266/gpio.h,sha256=drRteE3plCa62g9xm25cXu1CngCh-SQh2eNduCRuJCs,1060
|
891
891
|
esphome/components/esp8266/gpio.py,sha256=A2vOhpFK2674x2OJ8Ruy_c-Xfe2CWPVy2N3c4OBGYk4,6368
|
892
892
|
esphome/components/esp8266/post_build.py.script,sha256=Hca2nrttn2jdYmFVnNxsgMNlEFk2pg8GKMB6CTppR_k,703
|
@@ -1238,8 +1238,8 @@ esphome/components/i2s_audio/media_player/__init__.py,sha256=Is8GpC8A6eTDCdNCes3
|
|
1238
1238
|
esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp,sha256=OlvkjzYSdaxIjJiQF-BbjThoY91_rvGJ4woRjyB9mwY,7538
|
1239
1239
|
esphome/components/i2s_audio/media_player/i2s_audio_media_player.h,sha256=gmG6n9YU2Mz85CFa3fO7Na2KBdt9fOrGbDg0-C7jwjI,2078
|
1240
1240
|
esphome/components/i2s_audio/microphone/__init__.py,sha256=m62jL72XwxBavk9cDULs2cdcbHHkM96JF5RPiPBHGcg,4281
|
1241
|
-
esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp,sha256=
|
1242
|
-
esphome/components/i2s_audio/microphone/i2s_audio_microphone.h,sha256=
|
1241
|
+
esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp,sha256=yQ5b_bVg-2zNqfdunJL_8eeEzE97llg-JZV_DkgwNQM,16648
|
1242
|
+
esphome/components/i2s_audio/microphone/i2s_audio_microphone.h,sha256=QefL91wL9KHO6pN5DCxbrYNV1KsYGmR9cG8CosUe0pY,2348
|
1243
1243
|
esphome/components/i2s_audio/speaker/__init__.py,sha256=EUWTtCtc3T5zoaHMUnqu-KjJh5nnwKrkUAQi3QYEDi0,6152
|
1244
1244
|
esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp,sha256=vgdKk-CdPC4IuspdcJpypSv5L49fiqZ3ZtjKfTz4dmI,26865
|
1245
1245
|
esphome/components/i2s_audio/speaker/i2s_audio_speaker.h,sha256=VqfZH3A4ZgqeXuhJuiBhGsERKthxF4eJB1HCYDBvU0s,6666
|
@@ -1498,9 +1498,9 @@ esphome/components/lock/__init__.py,sha256=Ggh0T9KdTDyqmAeDzbmAYxnJzVVWkij2KylJt
|
|
1498
1498
|
esphome/components/lock/automation.h,sha256=7MU5AuJizydt7mKTr_uFsNleFI2jeBf7B_dNp3e8Fks,1771
|
1499
1499
|
esphome/components/lock/lock.cpp,sha256=IyEt5xShAxMpmcn_GAPFv2lRCS-kr4MjjfExxfXuK-Q,3212
|
1500
1500
|
esphome/components/lock/lock.h,sha256=kFFccTAu56e6PhZVATW0NznOj0M7VByEn9gc6l5M3eA,6042
|
1501
|
-
esphome/components/logger/__init__.py,sha256=
|
1501
|
+
esphome/components/logger/__init__.py,sha256=OOKS7yGtVaqIBoA0Y36mwNlK2H8182uDdy4cGPZwajA,14822
|
1502
1502
|
esphome/components/logger/logger.cpp,sha256=9dxWxuHgWpwMiD27CuQgXbkGMiC3Uc84iglwj67OSP0,10485
|
1503
|
-
esphome/components/logger/logger.h,sha256=
|
1503
|
+
esphome/components/logger/logger.h,sha256=653__PTXxyfs2_vR4QK0feZhYXPPMxsmP4DYz-Vz-lE,13016
|
1504
1504
|
esphome/components/logger/logger_esp32.cpp,sha256=SOLN5oHiVbnItxw4wdhvNdeunwgY7FR5j752fEt9__M,6101
|
1505
1505
|
esphome/components/logger/logger_esp8266.cpp,sha256=k7GvUlcLxXCVYqBw7tlHRikmRe7hdO6qV837wr4N2ww,1182
|
1506
1506
|
esphome/components/logger/logger_host.cpp,sha256=h3Its8pHiVvnyOc6rj5zRiug8rLi42f5QTQiTbBiCNo,450
|
@@ -1508,7 +1508,7 @@ esphome/components/logger/logger_libretiny.cpp,sha256=-GTn0YT2m2X2JS4H2R6w7kXUWz
|
|
1508
1508
|
esphome/components/logger/logger_rp2040.cpp,sha256=7X29d8hO65NIYS7fZoeyCR0oXC2LQcNuSAFtlvSniYw,991
|
1509
1509
|
esphome/components/logger/task_log_buffer.cpp,sha256=De8xetK8CYpQtjyt0jashw97IejgtRdBcuT1uHOmnPo,4616
|
1510
1510
|
esphome/components/logger/task_log_buffer.h,sha256=6E-H7Pe914Y-kPpfJJWlN7xtHoIPUpwoCNMCkrp1S4Y,2670
|
1511
|
-
esphome/components/logger/select/__init__.py,sha256=
|
1511
|
+
esphome/components/logger/select/__init__.py,sha256=a24OApXDycQ2ZtUrWtbdVpwicKRIhGqpJSyibhCQ6eE,1022
|
1512
1512
|
esphome/components/logger/select/logger_level_select.cpp,sha256=VTInyo463i-Qoin4c251e0nXKhsgTkixlQ1rwE1EC3s,627
|
1513
1513
|
esphome/components/logger/select/logger_level_select.h,sha256=rjUmIsZKszI8fK4FH--jkpmW4aDMNewiz8GOQoCtyn8,442
|
1514
1514
|
esphome/components/ltr390/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -1540,7 +1540,7 @@ esphome/components/lvgl/lvgl_esphome.cpp,sha256=YqbEb-zHjPptK9H9x157ozIJIpiefho0
|
|
1540
1540
|
esphome/components/lvgl/lvgl_esphome.h,sha256=8a5DaKfK0jWa1dQsA0bC0aw_RoPrLXC5vcBzVi4CCXU,13927
|
1541
1541
|
esphome/components/lvgl/lvgl_hal.h,sha256=aZqWpSmKKAB-ZfNxxgxjgASTtLpAZjXJKuoTiPB0qqU,431
|
1542
1542
|
esphome/components/lvgl/lvgl_proxy.h,sha256=JPmVBVh5zD5nraJCN7PqXVmQQlc4CPJe_X9tA6IAtXQ,547
|
1543
|
-
esphome/components/lvgl/schemas.py,sha256=
|
1543
|
+
esphome/components/lvgl/schemas.py,sha256=QySqz2vz4pON2HSBCHp-8tH19T7xrVUvRyoB3820aos,16398
|
1544
1544
|
esphome/components/lvgl/styles.py,sha256=HTqSzCIy2WUZhhChafVhBeVEemWqFfNyWtXII34XI7k,3010
|
1545
1545
|
esphome/components/lvgl/touchscreens.py,sha256=CntwVa1EUu6iBnxfvuv0rCYd_Njmf451CYdRqQyb9N4,1607
|
1546
1546
|
esphome/components/lvgl/trigger.py,sha256=nk36OgqEQWuSwFsTHprM-bhIjh15bh3NyrsK-ffqGsw,3442
|
@@ -1741,7 +1741,7 @@ esphome/components/micro_wake_word/automation.h,sha256=7Wx_ys9SK_coI1ychdtHTkxyE
|
|
1741
1741
|
esphome/components/micro_wake_word/micro_wake_word.cpp,sha256=vNqDK32iVXHxxa9UF7NrN_hHWsatRkirM-RtrzioDXU,17495
|
1742
1742
|
esphome/components/micro_wake_word/micro_wake_word.h,sha256=OUgT_KQB4Lr9JWuSKAn1PgtlhhR5f98LKoIzFL-nzyI,4200
|
1743
1743
|
esphome/components/micro_wake_word/preprocessor_settings.h,sha256=q-bNGC0UjUmx4WVvjI-T3RhPJHiMoT65NSlBs2YRX8s,1299
|
1744
|
-
esphome/components/micro_wake_word/streaming_model.cpp,sha256=
|
1744
|
+
esphome/components/micro_wake_word/streaming_model.cpp,sha256=fsVovrBmKkF6wLPbDzIH3aoQDbFGDb-T4mdzQU-GFIU,10804
|
1745
1745
|
esphome/components/micro_wake_word/streaming_model.h,sha256=2AT76eAKIGqtEFiNtsMARTTVOXxjjjRnxgYBZOumdM0,6170
|
1746
1746
|
esphome/components/micronova/__init__.py,sha256=iPElnW5XWXLEvZe1wWqgbRY_xhqiQNI7SB521tVJkXI,2668
|
1747
1747
|
esphome/components/micronova/micronova.cpp,sha256=gc0xDasM0sBvU6BNnT24ArBJ1bgrnoPcq9dWLuFbTD8,5297
|
@@ -2051,7 +2051,7 @@ esphome/components/one_wire/one_wire.cpp,sha256=bkAEEIDm3cCPM4RqDs-ZSZ4Moxbm7Fm8
|
|
2051
2051
|
esphome/components/one_wire/one_wire.h,sha256=QyYHANwfSz3xx9EKFtgxi2VRlzSQdfubyWXqZcuIzPI,1249
|
2052
2052
|
esphome/components/one_wire/one_wire_bus.cpp,sha256=gDFELdtwfDzOFevUJplZReGTSd8ggtxMZlysIOaunEw,2374
|
2053
2053
|
esphome/components/one_wire/one_wire_bus.h,sha256=eFNPYr6zduzj3HPiR4OIl6rzeWbN06E2BiPMws6NsFc,1626
|
2054
|
-
esphome/components/online_image/__init__.py,sha256=
|
2054
|
+
esphome/components/online_image/__init__.py,sha256=4MHDLi0iGBTuDS3ns5EjkaiTcN6Qr2q-cRD1_il1z2c,6231
|
2055
2055
|
esphome/components/online_image/bmp_image.cpp,sha256=3juptNvpk8tL5iyOlB2hKsJRPOH47Rn5liDBn1Cpi-s,4513
|
2056
2056
|
esphome/components/online_image/bmp_image.h,sha256=oOqxJ_6eC_73pQ5funjNB36tYWUZkHPagoo0XWJe_v8,933
|
2057
2057
|
esphome/components/online_image/image_decoder.cpp,sha256=p_693Ac8F-vs2n_1AZ7E57HBfLhAeeBWYpI3tDy6rnE,2215
|
@@ -2060,8 +2060,8 @@ esphome/components/online_image/jpeg_image.cpp,sha256=1qDTfzp7H6oxuRVBVXXgglourm
|
|
2060
2060
|
esphome/components/online_image/jpeg_image.h,sha256=RxlXrSxgd_j7tXYMGdkU1gVmkWB6Jc0YHuq13NrY9fc,741
|
2061
2061
|
esphome/components/online_image/online_image.cpp,sha256=NpXUoKdbIJRdPcY5tQ-fxa6WLpTYeRs8sHJnNP2M2pA,10585
|
2062
2062
|
esphome/components/online_image/online_image.h,sha256=40F0zWRI0p6A8pFfQdQ1eD5tnwgCxBDbeNcpCHgeUzk,7177
|
2063
|
-
esphome/components/online_image/png_image.cpp,sha256=
|
2064
|
-
esphome/components/online_image/png_image.h,sha256=
|
2063
|
+
esphome/components/online_image/png_image.cpp,sha256=HjglIePX4mMDlXMVjxfJJagYGLpnZCH9kyF-gH9BIc0,2922
|
2064
|
+
esphome/components/online_image/png_image.h,sha256=8hu7kw5nCP_uFSRk8JItr3_zZoXMSoe-xFV7Omd0H_c,776
|
2065
2065
|
esphome/components/opentherm/__init__.py,sha256=akuY6Z1QUybE_yrD3Yg6_GWQDQE5U5nO018OBxSCMco,5479
|
2066
2066
|
esphome/components/opentherm/automation.h,sha256=7Ob3hTNE0lwAO7jdJf2nuTzTPU__FI5psfn8j-4edsQ,627
|
2067
2067
|
esphome/components/opentherm/const.py,sha256=MercQyNt4vj245_74-O-ZULGjq19jux99aVFteiEVEU,244
|
@@ -2442,7 +2442,7 @@ esphome/components/rp2040/build_pio.py.script,sha256=aNtrSnjYcLY6t0NYBGszhwMPISV
|
|
2442
2442
|
esphome/components/rp2040/const.py,sha256=1x4XQlMfgQux1bllBAhz9ym-aUeFglxtPnQbpG3vUYQ,147
|
2443
2443
|
esphome/components/rp2040/core.cpp,sha256=hGPbOW4w5O3r04isZeAZtL2zWbe-sNf0TV7_7u1Sgzo,937
|
2444
2444
|
esphome/components/rp2040/core.h,sha256=YA4WtdKTdnZxkpOUF4GwT3KMjsbFjH6j0y42EvetLFA,239
|
2445
|
-
esphome/components/rp2040/gpio.cpp,sha256=
|
2445
|
+
esphome/components/rp2040/gpio.cpp,sha256=8aewN0-fqru1W7zj_g6hnhh9gjMKOIMamGIzSZkbozU,3516
|
2446
2446
|
esphome/components/rp2040/gpio.h,sha256=xIaLyJ0GLs2uNVxnYXweixWDW0nZ5bHmGCdCWQI55tA,1055
|
2447
2447
|
esphome/components/rp2040/gpio.py,sha256=HTZYi8manLRjLcEOwwSd7tTTEKa7btRco-gYQYudN7I,2913
|
2448
2448
|
esphome/components/rp2040/post_build.py.script,sha256=JgNm6aGGA9LYGZEjzqr8EHiugKLU6h7fmmXFAhdBleI,699
|
@@ -2741,7 +2741,7 @@ esphome/components/speaker/__init__.py,sha256=2juDem8QadLMwzFp8Rvl-KeIbE-iIEsCtD
|
|
2741
2741
|
esphome/components/speaker/automation.h,sha256=tVSTV49GvHk0bCEgLz3rNYFe8B1F0kXLgE-WihuRaV8,2320
|
2742
2742
|
esphome/components/speaker/speaker.h,sha256=Y6EuDzsIx8GDcFeWnYXg4cXiBU-6CkmrRCaMpXQYiWo,4355
|
2743
2743
|
esphome/components/speaker/media_player/__init__.py,sha256=bVvoKj9yiG0MOWFrMLAwnxdNjq8kxqUYRuokiCv7m4c,15264
|
2744
|
-
esphome/components/speaker/media_player/audio_pipeline.cpp,sha256=
|
2744
|
+
esphome/components/speaker/media_player/audio_pipeline.cpp,sha256=UYIc3ntV98vTADPj7CJLerSguhVQGScCOdtCOdMZ0pU,22362
|
2745
2745
|
esphome/components/speaker/media_player/audio_pipeline.h,sha256=MYt7_kp4IJDSTnXWqLaXIkbbNkGx6F_imSryFo2UUkc,5000
|
2746
2746
|
esphome/components/speaker/media_player/automation.h,sha256=I8psUHnJ8T3fkM05h1yEYDxb0yWe6Vjz7i30OSVA3Is,683
|
2747
2747
|
esphome/components/speaker/media_player/speaker_media_player.cpp,sha256=JpsDQjfEPZHuTofYzCcM92H5KkULyrua_z63mORqnDU,22668
|
@@ -3146,7 +3146,7 @@ esphome/components/tuya/light/tuya_light.h,sha256=uZ6FGnQ8IVXI6G7GpXs_QDcEzudqct
|
|
3146
3146
|
esphome/components/tuya/number/__init__.py,sha256=IJkUx89TiMNS2IwTLk6h_awtXqYP97wgWYw-ENGNq0Y,3188
|
3147
3147
|
esphome/components/tuya/number/tuya_number.cpp,sha256=hsTOxp3yV7CXeIXKzaShMuloSFHbHpyzJYP0EaNShnk,3084
|
3148
3148
|
esphome/components/tuya/number/tuya_number.h,sha256=scGw2WHoxcRkjwoLyW7yKNc2ZRVf4BeWnWnOYdWA7qQ,1125
|
3149
|
-
esphome/components/tuya/select/__init__.py,sha256=
|
3149
|
+
esphome/components/tuya/select/__init__.py,sha256=MGCSbYVB3JFJieImChsNAdQ07Shwzi-l6tJX5tNZB6Q,2019
|
3150
3150
|
esphome/components/tuya/select/tuya_select.cpp,sha256=7D2NQX29LDndyWzroQVjq2k9uQ4BtivtHmsUS98FdEw,1893
|
3151
3151
|
esphome/components/tuya/select/tuya_select.h,sha256=QQI1gglXhgfYri9CRc5sxzVHg2UVZFDyKYoBwMr5WPw,924
|
3152
3152
|
esphome/components/tuya/sensor/__init__.py,sha256=H301WiiVq8f3F84PJpJZojRgHnmW9TpLZwMLmLfpJB4,903
|
@@ -3503,9 +3503,9 @@ esphome/core/entity_base.cpp,sha256=uh9DdAAkCxmVVhelBtqkiGW4_P9gDcZMBuwFDSIEqEQ,
|
|
3503
3503
|
esphome/core/entity_base.h,sha256=y9pPjHUxtiadpSzUroBp8-YomztwZnzPVS6GF33YI3U,2831
|
3504
3504
|
esphome/core/entity_helpers.py,sha256=s5lYCG5hu_1SROtSWgzI0T6802l5-I8udGy1_6HNSdc,2337
|
3505
3505
|
esphome/core/gpio.h,sha256=kLkCnPxu4_1CsLR4BI_Baj1lDGoRIh8uubbwsIkJPIA,2575
|
3506
|
-
esphome/core/hal.h,sha256=
|
3506
|
+
esphome/core/hal.h,sha256=Le0-vtdDylYCaE9i4yvrv5-Y5PB5xoL3PM2FfMJsIeA,970
|
3507
3507
|
esphome/core/helpers.cpp,sha256=jdQr3nSMOj6bIFColDaxMa3_BsyL4gHi0FzeXNY5-rw,25140
|
3508
|
-
esphome/core/helpers.h,sha256=
|
3508
|
+
esphome/core/helpers.h,sha256=qGssN0aPZbEyt8PrqZ-I8bd_N7RuBN4KhzM-qdkagPA,30317
|
3509
3509
|
esphome/core/log.cpp,sha256=MDCx87ytW6Fz6basxYUpagkubFzUKO1ysvU5RXbXoII,1581
|
3510
3510
|
esphome/core/log.h,sha256=hnRVgv7LjfmCpFAFa5Trt_HmmChAm64j8a9c_N3GQXw,6493
|
3511
3511
|
esphome/core/macros.h,sha256=yNx3-Dq7tSRe40Ip_Kbhp9e6w7oDhxlWlGBDLRlZaUI,244
|
@@ -3516,7 +3516,7 @@ esphome/core/ring_buffer.h,sha256=4SeN2DYZLCHrLIjSPDsiAynIjwOoItiRUDO-u1wjq-o,29
|
|
3516
3516
|
esphome/core/scheduler.cpp,sha256=RUoEer5bFG8e7AH5sKa_aeeVyGHYIhOnpv6P5lNDIWw,11179
|
3517
3517
|
esphome/core/scheduler.h,sha256=zdC14yXpXrj54c4kUQMqDmnEHBdJlfrTLR1YRfPQDtE,2161
|
3518
3518
|
esphome/core/string_ref.cpp,sha256=of1TYMY6t3t4HjjPLSiItuPSa62AMG0lK_CU2HS1RvM,242
|
3519
|
-
esphome/core/string_ref.h,sha256=
|
3519
|
+
esphome/core/string_ref.h,sha256=Rd8HVBiUZrPA3TkPCwuAxGw91VX-e3Fky812OCNhNvA,5227
|
3520
3520
|
esphome/core/time.cpp,sha256=70xJvr0_ytMWtkxyT8gSkGgPGekzKiKUs08-7-FHNd0,7602
|
3521
3521
|
esphome/core/time.h,sha256=aQd7M_tO2X5ErvjTxpB6LmvdwJQjGlEfaqYe8rMkYWY,4347
|
3522
3522
|
esphome/core/util.cpp,sha256=gbTBqOdLxWIxv9h8HFrLPZ96HZI6PBY-WBB_gdiqEts,774
|
@@ -3530,7 +3530,7 @@ esphome/dashboard/dns.py,sha256=VrItOGoZO1xBUQr3AXekYtGzzpPxCfxB7h97qt7ixk0,1545
|
|
3530
3530
|
esphome/dashboard/entries.py,sha256=SWKJRQ7Zrm9dNm_yt34Ws1RY7rN1YgQysuU0lId7fq8,15666
|
3531
3531
|
esphome/dashboard/enum.py,sha256=rlQFVVxyBt5Iw7OL0o9F8D5LGgw23tbvi-KYjzP0QUQ,597
|
3532
3532
|
esphome/dashboard/settings.py,sha256=1iIGNTgU7xg6xvjazHYq8UHC6JXocKjKlsed0cQ-nkw,2858
|
3533
|
-
esphome/dashboard/web_server.py,sha256=
|
3533
|
+
esphome/dashboard/web_server.py,sha256=j5VGWK0A3phInRgMAo_cXCUbOmRqM2BzDXaJd15xgfQ,43714
|
3534
3534
|
esphome/dashboard/status/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3535
3535
|
esphome/dashboard/status/mdns.py,sha256=jAjLuysjr29HUGA0Y_IQp4D1Qm-d3yHdHY6K00gUCD4,4775
|
3536
3536
|
esphome/dashboard/status/mqtt.py,sha256=2QOq1vgwJCHW5uL_hqmi_R5fX5OTeTJUHx7c0pMLQKE,2578
|
@@ -3541,9 +3541,9 @@ esphome/dashboard/util/itertools.py,sha256=8eLrWEWmICLtXNxkKdYPQV0c_N4GEz8m9Npnb
|
|
3541
3541
|
esphome/dashboard/util/password.py,sha256=cQz3b9B-ijTe7zS6BeCW0hc3pWv6JjC78jmnycYYAh8,321
|
3542
3542
|
esphome/dashboard/util/subprocess.py,sha256=T8EW6dbU4LPd2DG1dRrdh8li71tt6J1isn411poMhkk,1022
|
3543
3543
|
esphome/dashboard/util/text.py,sha256=ENDnfN4O0NdA3CKVJjQYabFbwbrsIhVKrAMQe53qYu4,534
|
3544
|
-
esphome-2025.5.
|
3545
|
-
esphome-2025.5.
|
3546
|
-
esphome-2025.5.
|
3547
|
-
esphome-2025.5.
|
3548
|
-
esphome-2025.5.
|
3549
|
-
esphome-2025.5.
|
3544
|
+
esphome-2025.5.2.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
|
3545
|
+
esphome-2025.5.2.dist-info/METADATA,sha256=t1I9qsH4YynvZFulQpJoHcLWUuWE8JLyjxVekPJz_sQ,3624
|
3546
|
+
esphome-2025.5.2.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
|
3547
|
+
esphome-2025.5.2.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
|
3548
|
+
esphome-2025.5.2.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
|
3549
|
+
esphome-2025.5.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|