esphome 2025.4.0b1__py3-none-any.whl → 2025.4.0b2__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.
@@ -311,6 +311,10 @@ APIError APINoiseFrameHelper::state_action_() {
311
311
  const std::string &name = App.get_name();
312
312
  const uint8_t *name_ptr = reinterpret_cast<const uint8_t *>(name.c_str());
313
313
  msg.insert(msg.end(), name_ptr, name_ptr + name.size() + 1);
314
+ // node mac, terminated by null byte
315
+ const std::string &mac = get_mac_address();
316
+ const uint8_t *mac_ptr = reinterpret_cast<const uint8_t *>(mac.c_str());
317
+ msg.insert(msg.end(), mac_ptr, mac_ptr + mac.size() + 1);
314
318
 
315
319
  aerr = write_frame_(msg.data(), msg.size());
316
320
  if (aerr != APIError::OK)
@@ -30,8 +30,12 @@ void AXS15231Touchscreen::setup() {
30
30
  this->interrupt_pin_->setup();
31
31
  this->attach_interrupt_(this->interrupt_pin_, gpio::INTERRUPT_FALLING_EDGE);
32
32
  }
33
- this->x_raw_max_ = this->display_->get_native_width();
34
- this->y_raw_max_ = this->display_->get_native_height();
33
+ if (this->x_raw_max_ == 0) {
34
+ this->x_raw_max_ = this->display_->get_native_width();
35
+ }
36
+ if (this->y_raw_max_ == 0) {
37
+ this->y_raw_max_ = this->display_->get_native_height();
38
+ }
35
39
  ESP_LOGCONFIG(TAG, "AXS15231 Touchscreen setup complete");
36
40
  }
37
41
 
@@ -44,7 +48,7 @@ void AXS15231Touchscreen::update_touches() {
44
48
  err = this->read(data, sizeof(data));
45
49
  ERROR_CHECK(err);
46
50
  this->status_clear_warning();
47
- if (data[0] != 0) // no touches
51
+ if (data[0] != 0 || data[1] == 0) // no touches
48
52
  return;
49
53
  uint16_t x = encode_uint16(data[2] & 0xF, data[3]);
50
54
  uint16_t y = encode_uint16(data[4] & 0xF, data[5]);
@@ -4,6 +4,7 @@ from esphome import automation
4
4
  import esphome.codegen as cg
5
5
  import esphome.config_validation as cv
6
6
  from esphome.const import CONF_ACTION, CONF_GROUP, CONF_ID, CONF_TIMEOUT
7
+ from esphome.core import Lambda
7
8
  from esphome.cpp_generator import TemplateArguments, get_variable
8
9
  from esphome.cpp_types import nullptr
9
10
 
@@ -64,7 +65,14 @@ async def action_to_code(
64
65
  action_id,
65
66
  template_arg,
66
67
  args,
68
+ config=None,
67
69
  ):
70
+ # Ensure all required ids have been processed, so our LambdaContext doesn't get context-switched.
71
+ if config:
72
+ for lamb in config.values():
73
+ if isinstance(lamb, Lambda):
74
+ for id_ in lamb.requires_ids:
75
+ await get_variable(id_)
68
76
  await wait_for_widgets()
69
77
  async with LambdaContext(parameters=args, where=action_id) as context:
70
78
  for widget in widgets:
@@ -84,7 +92,9 @@ async def update_to_code(config, action_id, template_arg, args):
84
92
  lv.event_send(widget.obj, UPDATE_EVENT, nullptr)
85
93
 
86
94
  widgets = await get_widgets(config[CONF_ID])
87
- return await action_to_code(widgets, do_update, action_id, template_arg, args)
95
+ return await action_to_code(
96
+ widgets, do_update, action_id, template_arg, args, config
97
+ )
88
98
 
89
99
 
90
100
  @automation.register_condition(
@@ -348,4 +358,6 @@ async def obj_update_to_code(config, action_id, template_arg, args):
348
358
  await set_obj_properties(widget, config)
349
359
 
350
360
  widgets = await get_widgets(config[CONF_ID])
351
- return await action_to_code(widgets, do_update, action_id, template_arg, args)
361
+ return await action_to_code(
362
+ widgets, do_update, action_id, template_arg, args, config
363
+ )
@@ -18,6 +18,7 @@ from .helpers import lvgl_components_required, requires_component
18
18
  from .lvcode import lv, lv_add, lv_assign, lv_expr, lv_Pvariable
19
19
  from .schemas import ENCODER_SCHEMA
20
20
  from .types import lv_group_t, lv_indev_type_t, lv_key_t
21
+ from .widgets import get_widgets
21
22
 
22
23
  ENCODERS_CONFIG = cv.ensure_list(
23
24
  ENCODER_SCHEMA.extend(
@@ -76,5 +77,5 @@ async def encoders_to_code(var, config, default_group):
76
77
  async def initial_focus_to_code(config):
77
78
  for enc_conf in config[CONF_ENCODERS]:
78
79
  if default_focus := enc_conf.get(CONF_INITIAL_FOCUS):
79
- obj = await cg.get_variable(default_focus)
80
- lv.group_focus_obj(obj)
80
+ widget = await get_widgets(default_focus)
81
+ lv.group_focus_obj(widget[0].obj)
@@ -173,7 +173,8 @@ class LambdaContext(CodeContext):
173
173
 
174
174
  class LvContext(LambdaContext):
175
175
  """
176
- Code generation into the LVGL initialisation code (called in `setup()`)
176
+ Code generation into the LVGL initialisation code, called before setup() and loop()
177
+ Basically just does cg.add, so now fairly redundant.
177
178
  """
178
179
 
179
180
  added_lambda_count = 0
@@ -63,10 +63,12 @@ inline void lv_disp_set_bg_image(lv_disp_t *disp, esphome::image::Image *image)
63
63
  inline void lv_obj_set_style_bg_img_src(lv_obj_t *obj, esphome::image::Image *image, lv_style_selector_t selector) {
64
64
  lv_obj_set_style_bg_img_src(obj, image->get_lv_img_dsc(), selector);
65
65
  }
66
+ #ifdef USE_LVGL_CANVAS
66
67
  inline void lv_canvas_draw_img(lv_obj_t *canvas, lv_coord_t x, lv_coord_t y, image::Image *image,
67
68
  lv_draw_img_dsc_t *dsc) {
68
69
  lv_canvas_draw_img(canvas, x, y, image->get_lv_img_dsc(), dsc);
69
70
  }
71
+ #endif
70
72
 
71
73
  #ifdef USE_LVGL_METER
72
74
  inline lv_meter_indicator_t *lv_meter_add_needle_img(lv_obj_t *obj, lv_meter_scale_t *scale, esphome::image::Image *src,
@@ -1,6 +1,7 @@
1
1
  import esphome.codegen as cg
2
2
  from esphome.components import number
3
3
  import esphome.config_validation as cv
4
+ from esphome.const import CONF_RESTORE_VALUE
4
5
  from esphome.cpp_generator import MockObj
5
6
 
6
7
  from ..defines import CONF_ANIMATED, CONF_UPDATE_ON_RELEASE, CONF_WIDGET
@@ -10,21 +11,21 @@ from ..lvcode import (
10
11
  EVENT_ARG,
11
12
  UPDATE_EVENT,
12
13
  LambdaContext,
13
- LvContext,
14
+ ReturnStatement,
14
15
  lv,
15
- lv_add,
16
16
  lvgl_static,
17
17
  )
18
18
  from ..types import LV_EVENT, LvNumber, lvgl_ns
19
19
  from ..widgets import get_widgets, wait_for_widgets
20
20
 
21
- LVGLNumber = lvgl_ns.class_("LVGLNumber", number.Number)
21
+ LVGLNumber = lvgl_ns.class_("LVGLNumber", number.Number, cg.Component)
22
22
 
23
23
  CONFIG_SCHEMA = number.number_schema(LVGLNumber).extend(
24
24
  {
25
25
  cv.Required(CONF_WIDGET): cv.use_id(LvNumber),
26
26
  cv.Optional(CONF_ANIMATED, default=True): animated,
27
27
  cv.Optional(CONF_UPDATE_ON_RELEASE, default=False): cv.boolean,
28
+ cv.Optional(CONF_RESTORE_VALUE, default=False): cv.boolean,
28
29
  }
29
30
  )
30
31
 
@@ -32,32 +33,34 @@ CONFIG_SCHEMA = number.number_schema(LVGLNumber).extend(
32
33
  async def to_code(config):
33
34
  widget = await get_widgets(config, CONF_WIDGET)
34
35
  widget = widget[0]
35
- var = await number.new_number(
36
- config,
37
- max_value=widget.get_max(),
38
- min_value=widget.get_min(),
39
- step=widget.get_step(),
40
- )
41
-
42
36
  await wait_for_widgets()
37
+ async with LambdaContext([], return_type=cg.float_) as value:
38
+ value.add(ReturnStatement(widget.get_value()))
43
39
  async with LambdaContext([(cg.float_, "v")]) as control:
44
40
  await widget.set_property(
45
41
  "value", MockObj("v") * MockObj(widget.get_scale()), config[CONF_ANIMATED]
46
42
  )
47
43
  lv.event_send(widget.obj, API_EVENT, cg.nullptr)
48
- control.add(var.publish_state(widget.get_value()))
49
- async with LambdaContext(EVENT_ARG) as event:
50
- event.add(var.publish_state(widget.get_value()))
51
44
  event_code = (
52
45
  LV_EVENT.VALUE_CHANGED
53
46
  if not config[CONF_UPDATE_ON_RELEASE]
54
47
  else LV_EVENT.RELEASED
55
48
  )
56
- async with LvContext():
57
- lv_add(var.set_control_lambda(await control.get_lambda()))
58
- lv_add(
59
- lvgl_static.add_event_cb(
60
- widget.obj, await event.get_lambda(), UPDATE_EVENT, event_code
61
- )
49
+ var = await number.new_number(
50
+ config,
51
+ await control.get_lambda(),
52
+ await value.get_lambda(),
53
+ event_code,
54
+ config[CONF_RESTORE_VALUE],
55
+ max_value=widget.get_max(),
56
+ min_value=widget.get_min(),
57
+ step=widget.get_step(),
58
+ )
59
+ async with LambdaContext(EVENT_ARG) as event:
60
+ event.add(var.on_value())
61
+ await cg.register_component(var, config)
62
+ cg.add(
63
+ lvgl_static.add_event_cb(
64
+ widget.obj, await event.get_lambda(), UPDATE_EVENT, event_code
62
65
  )
63
- lv_add(var.publish_state(widget.get_value()))
66
+ )
@@ -3,33 +3,46 @@
3
3
  #include <utility>
4
4
 
5
5
  #include "esphome/components/number/number.h"
6
- #include "esphome/core/automation.h"
7
6
  #include "esphome/core/component.h"
8
7
  #include "esphome/core/preferences.h"
9
8
 
10
9
  namespace esphome {
11
10
  namespace lvgl {
12
11
 
13
- class LVGLNumber : public number::Number {
12
+ class LVGLNumber : public number::Number, public Component {
14
13
  public:
15
- void set_control_lambda(std::function<void(float)> control_lambda) {
16
- this->control_lambda_ = std::move(control_lambda);
17
- if (this->initial_state_.has_value()) {
18
- this->control_lambda_(this->initial_state_.value());
19
- this->initial_state_.reset();
14
+ LVGLNumber(std::function<void(float)> control_lambda, std::function<float()> value_lambda, lv_event_code_t event,
15
+ bool restore)
16
+ : control_lambda_(std::move(control_lambda)),
17
+ value_lambda_(std::move(value_lambda)),
18
+ event_(event),
19
+ restore_(restore) {}
20
+
21
+ void setup() override {
22
+ float value = this->value_lambda_();
23
+ if (this->restore_) {
24
+ this->pref_ = global_preferences->make_preference<float>(this->get_object_id_hash());
25
+ if (this->pref_.load(&value)) {
26
+ this->control_lambda_(value);
27
+ }
20
28
  }
29
+ this->publish_state(value);
21
30
  }
22
31
 
32
+ void on_value() { this->publish_state(this->value_lambda_()); }
33
+
23
34
  protected:
24
35
  void control(float value) override {
25
- if (this->control_lambda_ != nullptr) {
26
- this->control_lambda_(value);
27
- } else {
28
- this->initial_state_ = value;
29
- }
36
+ this->control_lambda_(value);
37
+ this->publish_state(value);
38
+ if (this->restore_)
39
+ this->pref_.save(&value);
30
40
  }
31
- std::function<void(float)> control_lambda_{};
32
- optional<float> initial_state_{};
41
+ std::function<void(float)> control_lambda_;
42
+ std::function<float()> value_lambda_;
43
+ lv_event_code_t event_;
44
+ bool restore_;
45
+ ESPPreferenceObject pref_{};
33
46
  };
34
47
 
35
48
  } // namespace lvgl
@@ -81,7 +81,9 @@ ENCODER_SCHEMA = cv.Schema(
81
81
  cv.declare_id(LVEncoderListener), requires_component("binary_sensor")
82
82
  ),
83
83
  cv.Optional(CONF_GROUP): cv.declare_id(lv_group_t),
84
- cv.Optional(df.CONF_INITIAL_FOCUS): cv.use_id(lv_obj_t),
84
+ cv.Optional(df.CONF_INITIAL_FOCUS): cv.All(
85
+ LIST_ACTION_SCHEMA, cv.Length(min=1, max=1)
86
+ ),
85
87
  cv.Optional(df.CONF_LONG_PRESS_TIME, default="400ms"): PRESS_TIME,
86
88
  cv.Optional(df.CONF_LONG_PRESS_REPEAT_TIME, default="100ms"): PRESS_TIME,
87
89
  }
@@ -1,18 +1,19 @@
1
+ import esphome.codegen as cg
1
2
  from esphome.components import select
2
3
  import esphome.config_validation as cv
3
- from esphome.const import CONF_OPTIONS
4
+ from esphome.const import CONF_ID, CONF_OPTIONS, CONF_RESTORE_VALUE
4
5
 
5
6
  from ..defines import CONF_ANIMATED, CONF_WIDGET, literal
6
- from ..lvcode import LvContext
7
7
  from ..types import LvSelect, lvgl_ns
8
- from ..widgets import get_widgets, wait_for_widgets
8
+ from ..widgets import get_widgets
9
9
 
10
- LVGLSelect = lvgl_ns.class_("LVGLSelect", select.Select)
10
+ LVGLSelect = lvgl_ns.class_("LVGLSelect", select.Select, cg.Component)
11
11
 
12
12
  CONFIG_SCHEMA = select.select_schema(LVGLSelect).extend(
13
13
  {
14
14
  cv.Required(CONF_WIDGET): cv.use_id(LvSelect),
15
15
  cv.Optional(CONF_ANIMATED, default=False): cv.boolean,
16
+ cv.Optional(CONF_RESTORE_VALUE, default=False): cv.boolean,
16
17
  }
17
18
  )
18
19
 
@@ -21,12 +22,9 @@ async def to_code(config):
21
22
  widget = await get_widgets(config, CONF_WIDGET)
22
23
  widget = widget[0]
23
24
  options = widget.config.get(CONF_OPTIONS, [])
24
- selector = await select.new_select(config, options=options)
25
- await wait_for_widgets()
26
- async with LvContext() as ctx:
27
- ctx.add(
28
- selector.set_widget(
29
- widget.var,
30
- literal("LV_ANIM_ON" if config[CONF_ANIMATED] else "LV_ANIM_OFF"),
31
- )
32
- )
25
+ animated = literal("LV_ANIM_ON" if config[CONF_ANIMATED] else "LV_ANIM_OFF")
26
+ selector = cg.new_Pvariable(
27
+ config[CONF_ID], widget.var, animated, config[CONF_RESTORE_VALUE]
28
+ )
29
+ await select.register_select(selector, config, options=options)
30
+ await cg.register_component(selector, config)
@@ -11,12 +11,20 @@
11
11
  namespace esphome {
12
12
  namespace lvgl {
13
13
 
14
- class LVGLSelect : public select::Select {
14
+ class LVGLSelect : public select::Select, public Component {
15
15
  public:
16
- void set_widget(LvSelectable *widget, lv_anim_enable_t anim = LV_ANIM_OFF) {
17
- this->widget_ = widget;
18
- this->anim_ = anim;
16
+ LVGLSelect(LvSelectable *widget, lv_anim_enable_t anim, bool restore)
17
+ : widget_(widget), anim_(anim), restore_(restore) {}
18
+
19
+ void setup() override {
19
20
  this->set_options_();
21
+ if (this->restore_) {
22
+ size_t index;
23
+ this->pref_ = global_preferences->make_preference<size_t>(this->get_object_id_hash());
24
+ if (this->pref_.load(&index))
25
+ this->widget_->set_selected_index(index, LV_ANIM_OFF);
26
+ }
27
+ this->publish();
20
28
  lv_obj_add_event_cb(
21
29
  this->widget_->obj,
22
30
  [](lv_event_t *e) {
@@ -24,11 +32,6 @@ class LVGLSelect : public select::Select {
24
32
  it->set_options_();
25
33
  },
26
34
  LV_EVENT_REFRESH, this);
27
- if (this->initial_state_.has_value()) {
28
- this->control(this->initial_state_.value());
29
- this->initial_state_.reset();
30
- }
31
- this->publish();
32
35
  auto lamb = [](lv_event_t *e) {
33
36
  auto *self = static_cast<LVGLSelect *>(e->user_data);
34
37
  self->publish();
@@ -37,21 +40,25 @@ class LVGLSelect : public select::Select {
37
40
  lv_obj_add_event_cb(this->widget_->obj, lamb, lv_update_event, this);
38
41
  }
39
42
 
40
- void publish() { this->publish_state(this->widget_->get_selected_text()); }
43
+ void publish() {
44
+ this->publish_state(this->widget_->get_selected_text());
45
+ if (this->restore_) {
46
+ auto index = this->widget_->get_selected_index();
47
+ this->pref_.save(&index);
48
+ }
49
+ }
41
50
 
42
51
  protected:
43
52
  void control(const std::string &value) override {
44
- if (this->widget_ != nullptr) {
45
- this->widget_->set_selected_text(value, this->anim_);
46
- } else {
47
- this->initial_state_ = value;
48
- }
53
+ this->widget_->set_selected_text(value, this->anim_);
54
+ this->publish();
49
55
  }
50
56
  void set_options_() { this->traits.set_options(this->widget_->get_options()); }
51
57
 
52
- LvSelectable *widget_{};
53
- optional<std::string> initial_state_{};
54
- lv_anim_enable_t anim_{LV_ANIM_OFF};
58
+ LvSelectable *widget_;
59
+ lv_anim_enable_t anim_;
60
+ bool restore_;
61
+ ESPPreferenceObject pref_{};
55
62
  };
56
63
 
57
64
  } // namespace lvgl
@@ -250,7 +250,7 @@ async def button_update_to_code(config, action_id, template_arg, args):
250
250
  widgets = await get_widgets(config[CONF_ID])
251
251
  assert all(isinstance(w, MatrixButton) for w in widgets)
252
252
 
253
- async def do_button_update(w: MatrixButton):
253
+ async def do_button_update(w):
254
254
  if (width := config.get(CONF_WIDTH)) is not None:
255
255
  lv.btnmatrix_set_btn_width(w.obj, w.index, width)
256
256
  if config.get(CONF_SELECTED):
@@ -275,5 +275,5 @@ async def button_update_to_code(config, action_id, template_arg, args):
275
275
  )
276
276
 
277
277
  return await action_to_code(
278
- widgets, do_button_update, action_id, template_arg, args
278
+ widgets, do_button_update, action_id, template_arg, args, config
279
279
  )
@@ -97,7 +97,7 @@ async def canvas_fill(config, action_id, template_arg, args):
97
97
  async def do_fill(w: Widget):
98
98
  lv.canvas_fill_bg(w.obj, color, opa)
99
99
 
100
- return await action_to_code(widget, do_fill, action_id, template_arg, args)
100
+ return await action_to_code(widget, do_fill, action_id, template_arg, args, config)
101
101
 
102
102
 
103
103
  @automation.register_action(
@@ -145,7 +145,9 @@ async def canvas_set_pixel(config, action_id, template_arg, args):
145
145
  x, y = point
146
146
  lv.canvas_set_px_opa(w.obj, x, y, opa_var)
147
147
 
148
- return await action_to_code(widget, do_set_pixels, action_id, template_arg, args)
148
+ return await action_to_code(
149
+ widget, do_set_pixels, action_id, template_arg, args, config
150
+ )
149
151
 
150
152
 
151
153
  DRAW_SCHEMA = cv.Schema(
@@ -181,7 +183,9 @@ async def draw_to_code(config, dsc_type, props, do_draw, action_id, template_arg
181
183
  lv_assign(getattr(dsc, mapped_prop), value)
182
184
  await do_draw(w, x, y, dsc_addr)
183
185
 
184
- return await action_to_code(widget, action_func, action_id, template_arg, args)
186
+ return await action_to_code(
187
+ widget, action_func, action_id, template_arg, args, config
188
+ )
185
189
 
186
190
 
187
191
  RECT_PROPS = {
@@ -297,7 +297,9 @@ async def indicator_update_to_code(config, action_id, template_arg, args):
297
297
  async def set_value(w: Widget):
298
298
  await set_indicator_values(w.var, w.obj, config)
299
299
 
300
- return await action_to_code(widget, set_value, action_id, template_arg, args)
300
+ return await action_to_code(
301
+ widget, set_value, action_id, template_arg, args, config
302
+ )
301
303
 
302
304
 
303
305
  async def set_indicator_values(meter, indicator, config):
@@ -441,9 +441,10 @@ void AudioPipeline::decode_task(void *params) {
441
441
  pdFALSE, // Wait for all the bits,
442
442
  portMAX_DELAY); // Block indefinitely until bit is set
443
443
 
444
+ xEventGroupClearBits(this_pipeline->event_group_,
445
+ EventGroupBits::DECODER_MESSAGE_FINISHED | EventGroupBits::READER_MESSAGE_LOADED_MEDIA_TYPE);
446
+
444
447
  if (!(event_bits & EventGroupBits::PIPELINE_COMMAND_STOP)) {
445
- xEventGroupClearBits(this_pipeline->event_group_,
446
- EventGroupBits::DECODER_MESSAGE_FINISHED | EventGroupBits::READER_MESSAGE_LOADED_MEDIA_TYPE);
447
448
  InfoErrorEvent event;
448
449
  event.source = InfoErrorSource::DECODER;
449
450
 
esphome/const.py CHANGED
@@ -1,6 +1,6 @@
1
1
  """Constants used by esphome."""
2
2
 
3
- __version__ = "2025.4.0b1"
3
+ __version__ = "2025.4.0b2"
4
4
 
5
5
  ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
6
6
  VALID_SUBSTITUTIONS_CHARACTERS = (
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: esphome
3
- Version: 2025.4.0b1
3
+ Version: 2025.4.0b2
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
@@ -37,9 +37,9 @@ Requires-Dist: pyserial==3.5
37
37
  Requires-Dist: platformio==6.1.18
38
38
  Requires-Dist: esptool==4.8.1
39
39
  Requires-Dist: click==8.1.7
40
- Requires-Dist: esphome-dashboard==20250212.0
41
- Requires-Dist: aioesphomeapi==29.9.0
42
- Requires-Dist: zeroconf==0.146.3
40
+ Requires-Dist: esphome-dashboard==20250415.0
41
+ Requires-Dist: aioesphomeapi==29.10.0
42
+ Requires-Dist: zeroconf==0.146.4
43
43
  Requires-Dist: puremagic==1.28
44
44
  Requires-Dist: ruamel.yaml==0.18.10
45
45
  Requires-Dist: esphome-glyphsets==0.2.0
@@ -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=wjCPycTq_dgETPuXycbWFwb8yorjVrS9Q-_b7YMA3jU,40830
8
+ esphome/const.py,sha256=U00foWVg7L2J3h7o4-5e48t8gl8y0deYApkPsFP3dFg,40830
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
@@ -184,7 +184,7 @@ esphome/components/apds9960/sensor.py,sha256=vUPm5H_IFROftGlMJWfgqSzm0IeLpYh5Dvt
184
184
  esphome/components/api/__init__.py,sha256=grnorxG9QG00eQwcIsiijno_o_JS6xKzOitqLS1DkXg,9895
185
185
  esphome/components/api/api_connection.cpp,sha256=AAPa8224_oaCWAA6O6PDvIdI_4L9ruQJbLLVcXI6B2Y,75389
186
186
  esphome/components/api/api_connection.h,sha256=32R1sK8nuRgfFY4Epu8mP92D6xYxkaa1JV5jkjjQfmc,16464
187
- esphome/components/api/api_frame_helper.cpp,sha256=kM0hpEuxCemfd7nPp8il_0an9KlGOoIkiDWgKsyxAJ8,33777
187
+ esphome/components/api/api_frame_helper.cpp,sha256=IekqxKtVIBUYFlzvYKoLQnaPIroJ9Qw_MOsIqMDoHf8,34005
188
188
  esphome/components/api/api_frame_helper.h,sha256=bn6Q2TvN6fulMFGUSm7fsxwlURlQAjl8EmMSPAj5uls,5543
189
189
  esphome/components/api/api_noise_context.h,sha256=0i3J3wchJitnQBTJeQm1380t0duhsz7WxJDrlUBF8mE,405
190
190
  esphome/components/api/api_pb2.cpp,sha256=8o0AeBOfenhR6wwRgRcqZ1pa0Mfnxk8Ur24_b9_K-b4,246814
@@ -269,7 +269,7 @@ esphome/components/audio_dac/audio_dac.h,sha256=CXjvs63O8NkTIstxO5ef1gRbDjYCf-tb
269
269
  esphome/components/audio_dac/automation.h,sha256=jCOreJMo7jmka07bWsDKhZ1hgaO4aES3KAiQVvF78wk,1050
270
270
  esphome/components/axs15231/__init__.py,sha256=JUxVM4FOixLS9XBPZR1-G3K1vm2F5VGBGg-3bfWsxGY,134
271
271
  esphome/components/axs15231/touchscreen/__init__.py,sha256=M7oqDl9R08jlbmOPGQ2X4Hxwpj2OQRtUY2o19KL26VQ,1159
272
- esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp,sha256=WNhcIzrpUVicsjZD5aw1auae9B2II2DM6oxUhGmYj-g,1965
272
+ esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp,sha256=Cqy9cwgwS33ds-QcpnScLZ3IbrsFvUF8QsoIl828XCE,2055
273
273
  esphome/components/axs15231/touchscreen/axs15231_touchscreen.h,sha256=gTkhwWVd_L8EfUj1iBqfJ2hLG2qJN9tgIZxes1F-KYc,675
274
274
  esphome/components/b_parasite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
275
275
  esphome/components/b_parasite/b_parasite.cpp,sha256=2jxB2kEyckQKoxUHv1NUSoey4jhn3-_I0bGTPBrl-XY,3352
@@ -1514,21 +1514,21 @@ esphome/components/ltr_als_ps/ltr_als_ps.h,sha256=TxgTmv7apRGsxHAxDow6-CpkQsdWID
1514
1514
  esphome/components/ltr_als_ps/ltr_definitions.h,sha256=yaIvnLQBIBnPuQBvHDD9Q_16Uoq1vnABwsTm8j77a3w,7255
1515
1515
  esphome/components/ltr_als_ps/sensor.py,sha256=xc5wYosnIplZZAvrINQVaIyn5EjhsINuBTJP49xZSd4,9980
1516
1516
  esphome/components/lvgl/__init__.py,sha256=UKkWDMiQ5hznHk1Lq0p9vBlbGfA-yBMYLJtrYTYis0g,18049
1517
- esphome/components/lvgl/automation.py,sha256=LLlL9cZg_M_1mqwF9jE7LFMQ-RWrL82Dz3W6b29IejQ,11208
1517
+ esphome/components/lvgl/automation.py,sha256=PBGuHvOggjJW76kAbjIjGR6XUlucjakdnf91RW1IG0M,11586
1518
1518
  esphome/components/lvgl/defines.py,sha256=7KL9hEpiI45KENeym5DGWqtS7hb5g-Hb8IYiC95p0N4,13893
1519
- esphome/components/lvgl/encoders.py,sha256=l296tfKdDzhRNPmU1chvAosNRrmBhITlB43OtNVBrRw,3189
1519
+ esphome/components/lvgl/encoders.py,sha256=IuFcb4AsU9WQrc9rCRudEiIuP0mBPoj2udCqY0mAIgY,3231
1520
1520
  esphome/components/lvgl/font.cpp,sha256=dcGMjvFZsMBxQUyn5sSQX8xc2parLFhkZOR9ew10h-Y,2699
1521
1521
  esphome/components/lvgl/gradient.py,sha256=K60e7b52N8i7aQjkLIsij7OOXmVhBnJnxj4J3zPme4w,1989
1522
1522
  esphome/components/lvgl/hello_world.py,sha256=iwfSWO0TT0CEGN5M_QBY_oKqmYshT69jOBDFTTUyBII,1417
1523
1523
  esphome/components/lvgl/helpers.py,sha256=XI3C5IHwoSVlgR32kMxeXTZWK6iW112nmWv5wByrKLY,1253
1524
1524
  esphome/components/lvgl/keypads.py,sha256=jtQjAG4vbTzI5Pr1IBfrEEPzV_0k4wkKfCMfsef6VT4,2124
1525
1525
  esphome/components/lvgl/lv_validation.py,sha256=8FoODFSzpxWUzRcwk7zOmv6TIpN9yXaHDIJjoCifOiA,13843
1526
- esphome/components/lvgl/lvcode.py,sha256=XKGH1qtqXZdMxEF6TsKBTR40WQ2B7F9-FrGmKWp8lN0,10049
1526
+ esphome/components/lvgl/lvcode.py,sha256=pTpwXB0ZehgHVMF1y-fAvaTZPTbWfwA-iZwTbl2W9hI,10118
1527
1527
  esphome/components/lvgl/lvgl_esphome.cpp,sha256=ZxJ-bm7wTxIbNST4uPLlhvGysfqOVqKyg1AOJzQe0aE,19253
1528
- esphome/components/lvgl/lvgl_esphome.h,sha256=gjDKya7ZhKSHN2n3l52P749Ivg_BEUsw9Y1OVNYfIdo,13897
1528
+ esphome/components/lvgl/lvgl_esphome.h,sha256=8a5DaKfK0jWa1dQsA0bC0aw_RoPrLXC5vcBzVi4CCXU,13927
1529
1529
  esphome/components/lvgl/lvgl_hal.h,sha256=aZqWpSmKKAB-ZfNxxgxjgASTtLpAZjXJKuoTiPB0qqU,431
1530
1530
  esphome/components/lvgl/lvgl_proxy.h,sha256=JPmVBVh5zD5nraJCN7PqXVmQQlc4CPJe_X9tA6IAtXQ,547
1531
- esphome/components/lvgl/schemas.py,sha256=kI63Wxk2c3D-hEjr2kHJ9jVmL1Ui5YPZbpFQ82sBLDc,16159
1531
+ esphome/components/lvgl/schemas.py,sha256=MsnVBsMAUB7xrZXZiZPFrpkLrhoOKxjbB94GgRkYUJQ,16213
1532
1532
  esphome/components/lvgl/styles.py,sha256=HTqSzCIy2WUZhhChafVhBeVEemWqFfNyWtXII34XI7k,3010
1533
1533
  esphome/components/lvgl/touchscreens.py,sha256=CntwVa1EUu6iBnxfvuv0rCYd_Njmf451CYdRqQyb9N4,1607
1534
1534
  esphome/components/lvgl/trigger.py,sha256=nk36OgqEQWuSwFsTHprM-bhIjh15bh3NyrsK-ffqGsw,3442
@@ -1536,10 +1536,10 @@ esphome/components/lvgl/types.py,sha256=corOqfPfZtK1WtIUvJ8TOFLhjcn5vjTi5dJvwX-g
1536
1536
  esphome/components/lvgl/binary_sensor/__init__.py,sha256=UaG5F3trL-S9P807PCbM2hHT4EUxAS0obSd6tlHXEoQ,1174
1537
1537
  esphome/components/lvgl/light/__init__.py,sha256=fyfI3RNQ67fA8yKhIirLg9ZLV4wFNMNvalqwqs04rqM,1006
1538
1538
  esphome/components/lvgl/light/lvgl_light.h,sha256=bNvnIYH7UrvVHgWxIIlP2XAfsmEVDzz2-aIA6DbR1iU,1231
1539
- esphome/components/lvgl/number/__init__.py,sha256=NFMkod8G2YSRgk53AkrVml2PL6KIG4bQzDCDL4IJc6Q,1970
1540
- esphome/components/lvgl/number/lvgl_number.h,sha256=UshgT5_EvfaA0nWWChjxoyIPy_0WXgRufYxwwO5nhcc,881
1541
- esphome/components/lvgl/select/__init__.py,sha256=KOlRVSjCt8TFrjrGPywpjKmQUUAzJUHuA_acLCp6-EI,1011
1542
- esphome/components/lvgl/select/lvgl_select.h,sha256=_nqOOVDNKcOEph6-EZ40VhjkgMdFRjVJB3OTl6tVIso,1659
1539
+ esphome/components/lvgl/number/__init__.py,sha256=87uISe2GUnBNiAXw9Cmd95c2g0vLMopyUvEk3yJ13N4,2131
1540
+ esphome/components/lvgl/number/lvgl_number.h,sha256=vWlC4QFlK08Ad5zN-XtLxUx5raW7xX6qUbZIgJH8BEw,1324
1541
+ esphome/components/lvgl/select/__init__.py,sha256=SKvXswVkDh3uGeOCw5sUxkeeia7dQdyDQHbR-cn8aMs,1101
1542
+ esphome/components/lvgl/select/lvgl_select.h,sha256=NqfsUcOo0QdaUCSQ4_mfYQ4EmyyQyByPRw_nZjWsWEA,1856
1543
1543
  esphome/components/lvgl/sensor/__init__.py,sha256=TCK3N05hAW1OjDYV1S5DUZd5JcmfpzWrcVwuA6PXf1c,1116
1544
1544
  esphome/components/lvgl/switch/__init__.py,sha256=d63-MV2Hbz_fNh_qWTEbe0K_g4eJX0x63TW2XyIrhe0,1909
1545
1545
  esphome/components/lvgl/switch/lvgl_switch.h,sha256=EUG9PQfryUD8EHP_GmYMGElOrBQG0Yd8FHyFFfBEvbw,686
@@ -1550,8 +1550,8 @@ esphome/components/lvgl/widgets/__init__.py,sha256=IcHp4fcwJsT-fglO2UngisZCkcsWd
1550
1550
  esphome/components/lvgl/widgets/animimg.py,sha256=RWPVVkMRhpnJPN_OLeuZq0eBHbW3TG-42G0HROM07BU,3120
1551
1551
  esphome/components/lvgl/widgets/arc.py,sha256=Gmqxe2AyROyU-7C9XKfzBY3g5CowV0ZJVsDzJAfUvCY,2522
1552
1552
  esphome/components/lvgl/widgets/button.py,sha256=lR_8dHZK3P9AY6WbjfL3Sj9oyTOf-i9qbvkGzcPpzgk,423
1553
- esphome/components/lvgl/widgets/buttonmatrix.py,sha256=okYCiIlGkIl3kHlhwXMgQKEMmM__PXLvo3RnZM_739Q,8648
1554
- esphome/components/lvgl/widgets/canvas.py,sha256=oiqyfp9b00uoRr8gicTcz8tYQkDSmHWFcgBFCgrzcbM,12277
1553
+ esphome/components/lvgl/widgets/buttonmatrix.py,sha256=6t3EsaoiCscj0kbilAbbc3XRO-PuPGTYX9TFVppP6xY,8642
1554
+ esphome/components/lvgl/widgets/canvas.py,sha256=2d28uDfpRUZtN9pjEE2nAXWuQFUCywsPFj8rox0fvdQ,12329
1555
1555
  esphome/components/lvgl/widgets/checkbox.py,sha256=5MiANLeX3o1uDAlCorw1aOfAkNx1SMnGm6rcXsSgq_c,891
1556
1556
  esphome/components/lvgl/widgets/dropdown.py,sha256=po7WxHBEU53HiB7srKPgI-cOe3dKcoG8RgpSvmB0gMY,3048
1557
1557
  esphome/components/lvgl/widgets/img.py,sha256=bWCMc7KO8Mzyvs8cGX1CVGL7qPi3rMH8v8fwX95wzqM,2374
@@ -1560,7 +1560,7 @@ esphome/components/lvgl/widgets/label.py,sha256=5xl1a6apdJgGKmkpL8m7RDASjaeKzjKT
1560
1560
  esphome/components/lvgl/widgets/led.py,sha256=qoe_kvZpoRkwbxz25Z66KQ__KLC2tfhAukChp1jdlDc,888
1561
1561
  esphome/components/lvgl/widgets/line.py,sha256=M5rTKIPG2MgpV1XOGTNCdrfuiAfSPLHEcTM6FmsgcjU,1330
1562
1562
  esphome/components/lvgl/widgets/lv_bar.py,sha256=DbiUvhKdh9bsRMTU-rJYYA5KCjBUxDsW-7tvx8-CIRM,1670
1563
- esphome/components/lvgl/widgets/meter.py,sha256=LSxl9RIV9Hfw3UtKrDtPRk0KF-dRUFTP6Z2S7NNgplY,11060
1563
+ esphome/components/lvgl/widgets/meter.py,sha256=I_BSID9CNbHSX1xhQJVtvjHSu3oLn1ftyESJ0rKhfwY,11082
1564
1564
  esphome/components/lvgl/widgets/msgbox.py,sha256=i98hz6RKJRMWQ4wz9T1qOHzmdmZ6yHDvHDeJ1T9_Gt0,5335
1565
1565
  esphome/components/lvgl/widgets/obj.py,sha256=6lKIfsdKLWIE8u_Lw0X0ChMCKcV8EZYF8WQKQEBCKYU,439
1566
1566
  esphome/components/lvgl/widgets/page.py,sha256=W7kQ1xfJLRMdy6wFKoA6tZxUXNKGBZWrjMw9OZRfLqA,5870
@@ -2694,7 +2694,7 @@ esphome/components/speaker/__init__.py,sha256=2juDem8QadLMwzFp8Rvl-KeIbE-iIEsCtD
2694
2694
  esphome/components/speaker/automation.h,sha256=tVSTV49GvHk0bCEgLz3rNYFe8B1F0kXLgE-WihuRaV8,2320
2695
2695
  esphome/components/speaker/speaker.h,sha256=WHAQzuNxkaUxCfPySHUONoun0Uudw917KVlnI71_Mjo,4712
2696
2696
  esphome/components/speaker/media_player/__init__.py,sha256=-bV3Fps2AGFUEW8C35py8ATO6bZhrWDGzW2YLM7kpnc,15436
2697
- esphome/components/speaker/media_player/audio_pipeline.cpp,sha256=CxWJFkt3IUb4o1w6ajh2rnINUqUSOK6RigEeFEGkMus,22365
2697
+ esphome/components/speaker/media_player/audio_pipeline.cpp,sha256=KCo7Ujy9IZsViBQ4WotYJ3OrjwaNx7iXH1j6A9NRcww,22362
2698
2698
  esphome/components/speaker/media_player/audio_pipeline.h,sha256=MYt7_kp4IJDSTnXWqLaXIkbbNkGx6F_imSryFo2UUkc,5000
2699
2699
  esphome/components/speaker/media_player/automation.h,sha256=I8psUHnJ8T3fkM05h1yEYDxb0yWe6Vjz7i30OSVA3Is,683
2700
2700
  esphome/components/speaker/media_player/speaker_media_player.cpp,sha256=4qbWSTcEBXKeqxqBF10K_M6C7ONjMev4OAdMyG-HrFo,23489
@@ -3481,9 +3481,9 @@ esphome/dashboard/util/itertools.py,sha256=8eLrWEWmICLtXNxkKdYPQV0c_N4GEz8m9Npnb
3481
3481
  esphome/dashboard/util/password.py,sha256=cQz3b9B-ijTe7zS6BeCW0hc3pWv6JjC78jmnycYYAh8,321
3482
3482
  esphome/dashboard/util/subprocess.py,sha256=T8EW6dbU4LPd2DG1dRrdh8li71tt6J1isn411poMhkk,1022
3483
3483
  esphome/dashboard/util/text.py,sha256=ENDnfN4O0NdA3CKVJjQYabFbwbrsIhVKrAMQe53qYu4,534
3484
- esphome-2025.4.0b1.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3485
- esphome-2025.4.0b1.dist-info/METADATA,sha256=7NmeHHHEU_pBZJAyc7SQ-9wvxJvpAmBHACqcvaKe70E,3672
3486
- esphome-2025.4.0b1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
3487
- esphome-2025.4.0b1.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3488
- esphome-2025.4.0b1.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3489
- esphome-2025.4.0b1.dist-info/RECORD,,
3484
+ esphome-2025.4.0b2.dist-info/licenses/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3485
+ esphome-2025.4.0b2.dist-info/METADATA,sha256=QDzQqlrluTWB6o0YzPZysWvsFSvlhigg7_zgG0ifL34,3673
3486
+ esphome-2025.4.0b2.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
3487
+ esphome-2025.4.0b2.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3488
+ esphome-2025.4.0b2.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3489
+ esphome-2025.4.0b2.dist-info/RECORD,,