esphome 2024.8.0__py3-none-any.whl → 2024.8.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.
@@ -172,19 +172,6 @@ def add_idf_component(
172
172
  KEY_COMPONENTS: components,
173
173
  KEY_SUBMODULES: submodules,
174
174
  }
175
- else:
176
- component_config = CORE.data[KEY_ESP32][KEY_COMPONENTS][name]
177
- if components is not None:
178
- component_config[KEY_COMPONENTS] = list(
179
- set(component_config[KEY_COMPONENTS] + components)
180
- )
181
- if submodules is not None:
182
- if component_config[KEY_SUBMODULES] is None:
183
- component_config[KEY_SUBMODULES] = submodules
184
- else:
185
- component_config[KEY_SUBMODULES] = list(
186
- set(component_config[KEY_SUBMODULES] + submodules)
187
- )
188
175
 
189
176
 
190
177
  def add_extra_script(stage: str, filename: str, path: str):
@@ -6,8 +6,8 @@ Constants already defined in esphome.const are not duplicated here and must be i
6
6
 
7
7
  from esphome import codegen as cg, config_validation as cv
8
8
  from esphome.const import CONF_ITEMS
9
- from esphome.core import Lambda
10
- from esphome.cpp_generator import LambdaExpression, MockObj
9
+ from esphome.core import ID, Lambda
10
+ from esphome.cpp_generator import MockObj
11
11
  from esphome.cpp_types import uint32
12
12
  from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor
13
13
 
@@ -22,22 +22,19 @@ def literal(arg):
22
22
  return arg
23
23
 
24
24
 
25
- def call_lambda(lamb: LambdaExpression):
26
- expr = lamb.content.strip()
27
- if expr.startswith("return") and expr.endswith(";"):
28
- return expr[7:][:-1]
29
- return f"{lamb}()"
30
-
31
-
32
25
  class LValidator:
33
26
  """
34
27
  A validator for a particular type used in LVGL. Usable in configs as a validator, also
35
28
  has `process()` to convert a value during code generation
36
29
  """
37
30
 
38
- def __init__(self, validator, rtype, retmapper=None, requires=None):
31
+ def __init__(
32
+ self, validator, rtype, idtype=None, idexpr=None, retmapper=None, requires=None
33
+ ):
39
34
  self.validator = validator
40
35
  self.rtype = rtype
36
+ self.idtype = idtype
37
+ self.idexpr = idexpr
41
38
  self.retmapper = retmapper
42
39
  self.requires = requires
43
40
 
@@ -46,6 +43,8 @@ class LValidator:
46
43
  value = requires_component(self.requires)(value)
47
44
  if isinstance(value, cv.Lambda):
48
45
  return cv.returning_lambda(value)
46
+ if self.idtype is not None and isinstance(value, ID):
47
+ return cv.use_id(self.idtype)(value)
49
48
  return self.validator(value)
50
49
 
51
50
  async def process(self, value, args=()):
@@ -53,10 +52,10 @@ class LValidator:
53
52
  return None
54
53
  if isinstance(value, Lambda):
55
54
  return cg.RawExpression(
56
- call_lambda(
57
- await cg.process_lambda(value, args, return_type=self.rtype)
58
- )
55
+ f"{await cg.process_lambda(value, args, return_type=self.rtype)}()"
59
56
  )
57
+ if self.idtype is not None and isinstance(value, ID):
58
+ return cg.RawExpression(f"{value}->{self.idexpr}")
60
59
  if self.retmapper is not None:
61
60
  return self.retmapper(value)
62
61
  return cg.safe_exp(value)
@@ -90,7 +89,7 @@ class LvConstant(LValidator):
90
89
  cv.ensure_list(self.one_of), uint32, retmapper=self.mapper
91
90
  )
92
91
 
93
- def mapper(self, value):
92
+ def mapper(self, value, args=()):
94
93
  if not isinstance(value, list):
95
94
  value = [value]
96
95
  return literal(
@@ -104,7 +103,7 @@ class LvConstant(LValidator):
104
103
 
105
104
  def extend(self, *choices):
106
105
  """
107
- Extend an LVconstant with additional choices.
106
+ Extend an LVCconstant with additional choices.
108
107
  :param choices: The extra choices
109
108
  :return: A new LVConstant instance
110
109
  """
@@ -432,8 +431,6 @@ CONF_ONE_LINE = "one_line"
432
431
  CONF_ON_SELECT = "on_select"
433
432
  CONF_ONE_CHECKED = "one_checked"
434
433
  CONF_NEXT = "next"
435
- CONF_PAD_ROW = "pad_row"
436
- CONF_PAD_COLUMN = "pad_column"
437
434
  CONF_PAGE = "page"
438
435
  CONF_PAGE_WRAP = "page_wrap"
439
436
  CONF_PASSWORD_MODE = "password_mode"
@@ -465,7 +462,6 @@ CONF_SKIP = "skip"
465
462
  CONF_SYMBOL = "symbol"
466
463
  CONF_TAB_ID = "tab_id"
467
464
  CONF_TABS = "tabs"
468
- CONF_TIME_FORMAT = "time_format"
469
465
  CONF_TILE = "tile"
470
466
  CONF_TILE_ID = "tile_id"
471
467
  CONF_TILES = "tiles"
@@ -1,14 +1,17 @@
1
1
  from typing import Union
2
2
 
3
3
  import esphome.codegen as cg
4
+ from esphome.components.binary_sensor import BinarySensor
4
5
  from esphome.components.color import ColorStruct
5
6
  from esphome.components.font import Font
6
7
  from esphome.components.image import Image_
8
+ from esphome.components.sensor import Sensor
9
+ from esphome.components.text_sensor import TextSensor
7
10
  import esphome.config_validation as cv
8
- from esphome.const import CONF_ARGS, CONF_COLOR, CONF_FORMAT, CONF_TIME, CONF_VALUE
9
- from esphome.core import HexInt, Lambda
11
+ from esphome.const import CONF_ARGS, CONF_COLOR, CONF_FORMAT, CONF_VALUE
12
+ from esphome.core import HexInt
10
13
  from esphome.cpp_generator import MockObj
11
- from esphome.cpp_types import ESPTime, uint32
14
+ from esphome.cpp_types import uint32
12
15
  from esphome.helpers import cpp_string_escape
13
16
  from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor
14
17
 
@@ -16,11 +19,9 @@ from . import types as ty
16
19
  from .defines import (
17
20
  CONF_END_VALUE,
18
21
  CONF_START_VALUE,
19
- CONF_TIME_FORMAT,
20
22
  LV_FONTS,
21
23
  LValidator,
22
24
  LvConstant,
23
- call_lambda,
24
25
  literal,
25
26
  )
26
27
  from .helpers import (
@@ -109,13 +110,13 @@ def angle(value):
109
110
  def size_validator(value):
110
111
  """A size in one axis - one of "size_content", a number (pixels) or a percentage"""
111
112
  if value == SCHEMA_EXTRACT:
112
- return ["SIZE_CONTENT", "number of pixels", "percentage"]
113
+ return ["size_content", "pixels", "..%"]
113
114
  if isinstance(value, str) and value.lower().endswith("px"):
114
115
  value = cv.int_(value[:-2])
115
116
  if isinstance(value, str) and not value.endswith("%"):
116
117
  if value.upper() == "SIZE_CONTENT":
117
118
  return "LV_SIZE_CONTENT"
118
- raise cv.Invalid("must be 'size_content', a percentage or an integer (pixels)")
119
+ raise cv.Invalid("must be 'size_content', a pixel position or a percentage")
119
120
  if isinstance(value, int):
120
121
  return cv.int_(value)
121
122
  # Will throw an exception if not a percentage.
@@ -124,15 +125,6 @@ def size_validator(value):
124
125
 
125
126
  size = LValidator(size_validator, uint32, retmapper=literal)
126
127
 
127
-
128
- def pixels_validator(value):
129
- if isinstance(value, str) and value.lower().endswith("px"):
130
- return cv.int_(value[:-2])
131
- return cv.int_(value)
132
-
133
-
134
- pixels = LValidator(pixels_validator, uint32, retmapper=literal)
135
-
136
128
  radius_consts = LvConstant("LV_RADIUS_", "CIRCLE")
137
129
 
138
130
 
@@ -175,7 +167,9 @@ lv_image = LValidator(
175
167
  retmapper=lambda x: lv_expr.img_from(MockObj(x)),
176
168
  requires="image",
177
169
  )
178
- lv_bool = LValidator(cv.boolean, cg.bool_, retmapper=literal)
170
+ lv_bool = LValidator(
171
+ cv.boolean, cg.bool_, BinarySensor, "get_state()", retmapper=literal
172
+ )
179
173
 
180
174
 
181
175
  def lv_pct(value: Union[int, float]):
@@ -191,60 +185,42 @@ def lvms_validator_(value):
191
185
 
192
186
 
193
187
  lv_milliseconds = LValidator(
194
- lvms_validator_, cg.int32, retmapper=lambda x: x.total_milliseconds
188
+ lvms_validator_,
189
+ cg.int32,
190
+ retmapper=lambda x: x.total_milliseconds,
195
191
  )
196
192
 
197
193
 
198
194
  class TextValidator(LValidator):
199
195
  def __init__(self):
200
- super().__init__(cv.string, cg.std_string, lambda s: cg.safe_exp(f"{s}"))
196
+ super().__init__(
197
+ cv.string,
198
+ cg.const_char_ptr,
199
+ TextSensor,
200
+ "get_state().c_str()",
201
+ lambda s: cg.safe_exp(f"{s}"),
202
+ )
201
203
 
202
204
  def __call__(self, value):
203
- if isinstance(value, dict) and CONF_FORMAT in value:
205
+ if isinstance(value, dict):
204
206
  return value
205
207
  return super().__call__(value)
206
208
 
207
209
  async def process(self, value, args=()):
208
210
  if isinstance(value, dict):
209
- if format_str := value.get(CONF_FORMAT):
210
- args = [str(x) for x in value[CONF_ARGS]]
211
- arg_expr = cg.RawExpression(",".join(args))
212
- format_str = cpp_string_escape(format_str)
213
- return literal(f"str_sprintf({format_str}, {arg_expr}).c_str()")
214
- if time_format := value.get(CONF_TIME_FORMAT):
215
- source = value[CONF_TIME]
216
- if isinstance(source, Lambda):
217
- time_format = cpp_string_escape(time_format)
218
- return cg.RawExpression(
219
- call_lambda(
220
- await cg.process_lambda(source, args, return_type=ESPTime)
221
- )
222
- + f".strftime({time_format}).c_str()"
223
- )
224
- # must be an ID
225
- source = await cg.get_variable(source)
226
- return source.now().strftime(time_format).c_str()
227
- if isinstance(value, Lambda):
228
- value = call_lambda(
229
- await cg.process_lambda(value, args, return_type=self.rtype)
230
- )
231
-
232
- # Was the lambda call reduced to a string?
233
- if value.endswith("c_str()") or (
234
- value.endswith('"') and value.startswith('"')
235
- ):
236
- pass
237
- else:
238
- # Either a std::string or a lambda call returning that. We need const char*
239
- value = f"({value}).c_str()"
240
- return cg.RawExpression(value)
211
+ args = [str(x) for x in value[CONF_ARGS]]
212
+ arg_expr = cg.RawExpression(",".join(args))
213
+ format_str = cpp_string_escape(value[CONF_FORMAT])
214
+ return literal(f"str_sprintf({format_str}, {arg_expr}).c_str()")
241
215
  return await super().process(value, args)
242
216
 
243
217
 
244
218
  lv_text = TextValidator()
245
- lv_float = LValidator(cv.float_, cg.float_)
246
- lv_int = LValidator(cv.int_, cg.int_)
247
- lv_brightness = LValidator(cv.percentage, cg.float_, retmapper=lambda x: int(x * 255))
219
+ lv_float = LValidator(cv.float_, cg.float_, Sensor, "get_state()")
220
+ lv_int = LValidator(cv.int_, cg.int_, Sensor, "get_state()")
221
+ lv_brightness = LValidator(
222
+ cv.percentage, cg.float_, Sensor, "get_state()", retmapper=lambda x: int(x * 255)
223
+ )
248
224
 
249
225
 
250
226
  def is_lv_font(font):
@@ -1,6 +1,5 @@
1
1
  from esphome import config_validation as cv
2
2
  from esphome.automation import Trigger, validate_automation
3
- from esphome.components.time import RealTimeClock
4
3
  from esphome.const import (
5
4
  CONF_ARGS,
6
5
  CONF_FORMAT,
@@ -9,7 +8,6 @@ from esphome.const import (
9
8
  CONF_ON_VALUE,
10
9
  CONF_STATE,
11
10
  CONF_TEXT,
12
- CONF_TIME,
13
11
  CONF_TRIGGER_ID,
14
12
  CONF_TYPE,
15
13
  )
@@ -17,7 +15,6 @@ from esphome.core import TimePeriod
17
15
  from esphome.schema_extractors import SCHEMA_EXTRACT
18
16
 
19
17
  from . import defines as df, lv_validation as lvalid
20
- from .defines import CONF_TIME_FORMAT
21
18
  from .helpers import add_lv_use, requires_component, validate_printf
22
19
  from .lv_validation import lv_color, lv_font, lv_image
23
20
  from .lvcode import LvglComponent
@@ -49,13 +46,7 @@ TEXT_SCHEMA = cv.Schema(
49
46
  ),
50
47
  validate_printf,
51
48
  ),
52
- cv.Schema(
53
- {
54
- cv.Required(CONF_TIME_FORMAT): cv.string,
55
- cv.GenerateID(CONF_TIME): cv.templatable(cv.use_id(RealTimeClock)),
56
- }
57
- ),
58
- cv.templatable(cv.string),
49
+ lvalid.lv_text,
59
50
  )
60
51
  }
61
52
  )
@@ -125,13 +116,15 @@ STYLE_PROPS = {
125
116
  "opa_layered": lvalid.opacity,
126
117
  "outline_color": lvalid.lv_color,
127
118
  "outline_opa": lvalid.opacity,
128
- "outline_pad": lvalid.pixels,
129
- "outline_width": lvalid.pixels,
130
- "pad_all": lvalid.pixels,
131
- "pad_bottom": lvalid.pixels,
132
- "pad_left": lvalid.pixels,
133
- "pad_right": lvalid.pixels,
134
- "pad_top": lvalid.pixels,
119
+ "outline_pad": lvalid.size,
120
+ "outline_width": lvalid.size,
121
+ "pad_all": lvalid.size,
122
+ "pad_bottom": lvalid.size,
123
+ "pad_column": lvalid.size,
124
+ "pad_left": lvalid.size,
125
+ "pad_right": lvalid.size,
126
+ "pad_row": lvalid.size,
127
+ "pad_top": lvalid.size,
135
128
  "shadow_color": lvalid.lv_color,
136
129
  "shadow_ofs_x": cv.int_,
137
130
  "shadow_ofs_y": cv.int_,
@@ -311,8 +304,6 @@ LAYOUT_SCHEMA = {
311
304
  cv.Required(df.CONF_GRID_COLUMNS): [grid_spec],
312
305
  cv.Optional(df.CONF_GRID_COLUMN_ALIGN): grid_alignments,
313
306
  cv.Optional(df.CONF_GRID_ROW_ALIGN): grid_alignments,
314
- cv.Optional(df.CONF_PAD_ROW): lvalid.pixels,
315
- cv.Optional(df.CONF_PAD_COLUMN): lvalid.pixels,
316
307
  },
317
308
  df.TYPE_FLEX: {
318
309
  cv.Optional(
@@ -321,8 +312,6 @@ LAYOUT_SCHEMA = {
321
312
  cv.Optional(df.CONF_FLEX_ALIGN_MAIN, default="start"): flex_alignments,
322
313
  cv.Optional(df.CONF_FLEX_ALIGN_CROSS, default="start"): flex_alignments,
323
314
  cv.Optional(df.CONF_FLEX_ALIGN_TRACK, default="start"): flex_alignments,
324
- cv.Optional(df.CONF_PAD_ROW): lvalid.pixels,
325
- cv.Optional(df.CONF_PAD_COLUMN): lvalid.pixels,
326
315
  },
327
316
  },
328
317
  lower=True,
@@ -349,6 +338,7 @@ DISP_BG_SCHEMA = cv.Schema(
349
338
  }
350
339
  )
351
340
 
341
+
352
342
  # A style schema that can include text
353
343
  STYLED_TEXT_SCHEMA = cv.maybe_simple_value(
354
344
  STYLE_SCHEMA.extend(TEXT_SCHEMA), key=CONF_TEXT
@@ -20,8 +20,6 @@ from ..defines import (
20
20
  CONF_GRID_ROWS,
21
21
  CONF_LAYOUT,
22
22
  CONF_MAIN,
23
- CONF_PAD_COLUMN,
24
- CONF_PAD_ROW,
25
23
  CONF_SCROLLBAR_MODE,
26
24
  CONF_STYLES,
27
25
  CONF_WIDGETS,
@@ -31,7 +29,6 @@ from ..defines import (
31
29
  TYPE_FLEX,
32
30
  TYPE_GRID,
33
31
  LValidator,
34
- call_lambda,
35
32
  join_enums,
36
33
  literal,
37
34
  )
@@ -276,10 +273,6 @@ async def set_obj_properties(w: Widget, config):
276
273
  layout_type: str = layout[CONF_TYPE]
277
274
  add_lv_use(layout_type)
278
275
  lv_obj.set_layout(w.obj, literal(f"LV_LAYOUT_{layout_type.upper()}"))
279
- if (pad_row := layout.get(CONF_PAD_ROW)) is not None:
280
- w.set_style(CONF_PAD_ROW, pad_row, 0)
281
- if (pad_column := layout.get(CONF_PAD_COLUMN)) is not None:
282
- w.set_style(CONF_PAD_COLUMN, pad_column, 0)
283
276
  if layout_type == TYPE_GRID:
284
277
  wid = config[CONF_ID]
285
278
  rows = [str(x) for x in layout[CONF_GRID_ROWS]]
@@ -323,13 +316,8 @@ async def set_obj_properties(w: Widget, config):
323
316
  flag_clr = set()
324
317
  flag_set = set()
325
318
  props = parts[CONF_MAIN][CONF_DEFAULT]
326
- lambs = {}
327
- flag_set = set()
328
- flag_clr = set()
329
319
  for prop, value in {k: v for k, v in props.items() if k in OBJ_FLAGS}.items():
330
- if isinstance(value, cv.Lambda):
331
- lambs[prop] = value
332
- elif value:
320
+ if value:
333
321
  flag_set.add(prop)
334
322
  else:
335
323
  flag_clr.add(prop)
@@ -339,13 +327,6 @@ async def set_obj_properties(w: Widget, config):
339
327
  if flag_clr:
340
328
  clrs = join_enums(flag_clr, "LV_OBJ_FLAG_")
341
329
  w.clear_flag(clrs)
342
- for key, value in lambs.items():
343
- lamb = await cg.process_lambda(value, [], return_type=cg.bool_)
344
- flag = f"LV_OBJ_FLAG_{key.upper()}"
345
- with LvConditional(call_lambda(lamb)) as cond:
346
- w.add_flag(flag)
347
- cond.else_()
348
- w.clear_flag(flag)
349
330
 
350
331
  if states := config.get(CONF_STATE):
351
332
  adds = set()
@@ -367,7 +348,7 @@ async def set_obj_properties(w: Widget, config):
367
348
  for key, value in lambs.items():
368
349
  lamb = await cg.process_lambda(value, [], return_type=cg.bool_)
369
350
  state = f"LV_STATE_{key.upper()}"
370
- with LvConditional(call_lambda(lamb)) as cond:
351
+ with LvConditional(f"{lamb}()") as cond:
371
352
  w.add_state(state)
372
353
  cond.else_()
373
354
  w.clear_state(state)
@@ -1,9 +1,6 @@
1
1
  #pragma once
2
2
 
3
- #include <stddef.h>
4
- #include <cstdint>
5
- #include <functional>
6
- #include <vector>
3
+ #include "esphome/core/entity_base.h"
7
4
  #include "esphome/core/helpers.h"
8
5
 
9
6
  namespace esphome {
@@ -7,10 +7,8 @@
7
7
 
8
8
  #include <hardware/clocks.h>
9
9
  #include <hardware/dma.h>
10
- #include <hardware/irq.h>
11
10
  #include <hardware/pio.h>
12
11
  #include <pico/stdlib.h>
13
- #include <pico/sem.h>
14
12
 
15
13
  namespace esphome {
16
14
  namespace rp2040_pio_led_strip {
@@ -25,19 +23,6 @@ static std::map<Chipset, bool> conf_count_ = {
25
23
  {CHIPSET_WS2812, false}, {CHIPSET_WS2812B, false}, {CHIPSET_SK6812, false},
26
24
  {CHIPSET_SM16703, false}, {CHIPSET_CUSTOM, false},
27
25
  };
28
- static bool dma_chan_active_[12];
29
- static struct semaphore dma_write_complete_sem_[12];
30
-
31
- // DMA interrupt service routine
32
- void RP2040PIOLEDStripLightOutput::dma_write_complete_handler_() {
33
- uint32_t channel = dma_hw->ints0;
34
- for (uint dma_chan = 0; dma_chan < 12; ++dma_chan) {
35
- if (RP2040PIOLEDStripLightOutput::dma_chan_active_[dma_chan] && (channel & (1u << dma_chan))) {
36
- dma_hw->ints0 = (1u << dma_chan); // Clear the interrupt
37
- sem_release(&RP2040PIOLEDStripLightOutput::dma_write_complete_sem_[dma_chan]); // Handle the interrupt
38
- }
39
- }
40
- }
41
26
 
42
27
  void RP2040PIOLEDStripLightOutput::setup() {
43
28
  ESP_LOGCONFIG(TAG, "Setting up RP2040 LED Strip...");
@@ -72,22 +57,22 @@ void RP2040PIOLEDStripLightOutput::setup() {
72
57
  // but there are only 4 state machines on each PIO so we can only have 4 strips per PIO
73
58
  uint offset = 0;
74
59
 
75
- if (RP2040PIOLEDStripLightOutput::num_instance_[this->pio_ == pio0 ? 0 : 1] > 4) {
60
+ if (num_instance_[this->pio_ == pio0 ? 0 : 1] > 4) {
76
61
  ESP_LOGE(TAG, "Too many instances of PIO program");
77
62
  this->mark_failed();
78
63
  return;
79
64
  }
80
65
  // keep track of how many instances of the PIO program are running on each PIO
81
- RP2040PIOLEDStripLightOutput::num_instance_[this->pio_ == pio0 ? 0 : 1]++;
66
+ num_instance_[this->pio_ == pio0 ? 0 : 1]++;
82
67
 
83
68
  // if there are multiple strips of the same chipset, we can reuse the same PIO program and save space
84
69
  if (this->conf_count_[this->chipset_]) {
85
- offset = RP2040PIOLEDStripLightOutput::chipset_offsets_[this->chipset_];
70
+ offset = chipset_offsets_[this->chipset_];
86
71
  } else {
87
72
  // Load the assembled program into the PIO and get its location in the PIO's instruction memory and save it
88
73
  offset = pio_add_program(this->pio_, this->program_);
89
- RP2040PIOLEDStripLightOutput::chipset_offsets_[this->chipset_] = offset;
90
- RP2040PIOLEDStripLightOutput::conf_count_[this->chipset_] = true;
74
+ chipset_offsets_[this->chipset_] = offset;
75
+ conf_count_[this->chipset_] = true;
91
76
  }
92
77
 
93
78
  // Configure the state machine's PIO, and start it
@@ -108,9 +93,6 @@ void RP2040PIOLEDStripLightOutput::setup() {
108
93
  return;
109
94
  }
110
95
 
111
- // Mark the DMA channel as active
112
- RP2040PIOLEDStripLightOutput::dma_chan_active_[this->dma_chan_] = true;
113
-
114
96
  this->dma_config_ = dma_channel_get_default_config(this->dma_chan_);
115
97
  channel_config_set_transfer_data_size(
116
98
  &this->dma_config_,
@@ -127,13 +109,6 @@ void RP2040PIOLEDStripLightOutput::setup() {
127
109
  false // don't start yet
128
110
  );
129
111
 
130
- // Initialize the semaphore for this DMA channel
131
- sem_init(&RP2040PIOLEDStripLightOutput::dma_write_complete_sem_[this->dma_chan_], 1, 1);
132
-
133
- irq_set_exclusive_handler(DMA_IRQ_0, dma_write_complete_handler_); // after DMA all data, raise an interrupt
134
- dma_channel_set_irq0_enabled(this->dma_chan_, true); // map DMA channel to interrupt
135
- irq_set_enabled(DMA_IRQ_0, true); // enable interrupt
136
-
137
112
  this->init_(this->pio_, this->sm_, offset, this->pin_, this->max_refresh_rate_);
138
113
  }
139
114
 
@@ -151,7 +126,6 @@ void RP2040PIOLEDStripLightOutput::write_state(light::LightState *state) {
151
126
  }
152
127
 
153
128
  // the bits are already in the correct order for the pio program so we can just copy the buffer using DMA
154
- sem_acquire_blocking(&RP2040PIOLEDStripLightOutput::dma_write_complete_sem_[this->dma_chan_]);
155
129
  dma_channel_transfer_from_buffer_now(this->dma_chan_, this->buf_, this->get_buffer_size_());
156
130
  }
157
131
 
@@ -13,7 +13,6 @@
13
13
  #include <hardware/pio.h>
14
14
  #include <hardware/structs/pio.h>
15
15
  #include <pico/stdio.h>
16
- #include <pico/sem.h>
17
16
  #include <map>
18
17
 
19
18
  namespace esphome {
@@ -96,8 +95,6 @@ class RP2040PIOLEDStripLightOutput : public light::AddressableLight {
96
95
 
97
96
  size_t get_buffer_size_() const { return this->num_leds_ * (3 + this->is_rgbw_); }
98
97
 
99
- static void dma_write_complete_handler_();
100
-
101
98
  uint8_t *buf_{nullptr};
102
99
  uint8_t *effect_data_{nullptr};
103
100
 
@@ -123,8 +120,6 @@ class RP2040PIOLEDStripLightOutput : public light::AddressableLight {
123
120
  inline static int num_instance_[2];
124
121
  inline static std::map<Chipset, bool> conf_count_;
125
122
  inline static std::map<Chipset, int> chipset_offsets_;
126
- inline static bool dma_chan_active_[12];
127
- inline static struct semaphore dma_write_complete_sem_[12];
128
123
  };
129
124
 
130
125
  } // namespace rp2040_pio_led_strip
@@ -32,7 +32,7 @@ void Rtttl::play(std::string rtttl) {
32
32
  if (this->state_ != State::STATE_STOPPED && this->state_ != State::STATE_STOPPING) {
33
33
  int pos = this->rtttl_.find(':');
34
34
  auto name = this->rtttl_.substr(0, pos);
35
- ESP_LOGW(TAG, "RTTTL Component is already playing: %s", name.c_str());
35
+ ESP_LOGW(TAG, "RTTL Component is already playing: %s", name.c_str());
36
36
  return;
37
37
  }
38
38
 
@@ -122,7 +122,6 @@ void Rtttl::stop() {
122
122
  #ifdef USE_OUTPUT
123
123
  if (this->output_ != nullptr) {
124
124
  this->output_->set_level(0.0);
125
- this->set_state_(STATE_STOPPED);
126
125
  }
127
126
  #endif
128
127
  #ifdef USE_SPEAKER
@@ -130,10 +129,10 @@ void Rtttl::stop() {
130
129
  if (this->speaker_->is_running()) {
131
130
  this->speaker_->stop();
132
131
  }
133
- this->set_state_(STATE_STOPPING);
134
132
  }
135
133
  #endif
136
134
  this->note_duration_ = 0;
135
+ this->set_state_(STATE_STOPPING);
137
136
  }
138
137
 
139
138
  void Rtttl::loop() {
@@ -343,7 +342,6 @@ void Rtttl::finish_() {
343
342
  #ifdef USE_OUTPUT
344
343
  if (this->output_ != nullptr) {
345
344
  this->output_->set_level(0.0);
346
- this->set_state_(State::STATE_STOPPED);
347
345
  }
348
346
  #endif
349
347
  #ifdef USE_SPEAKER
@@ -356,9 +354,9 @@ void Rtttl::finish_() {
356
354
  this->speaker_->play((uint8_t *) (&sample), 8);
357
355
 
358
356
  this->speaker_->finish();
359
- this->set_state_(State::STATE_STOPPING);
360
357
  }
361
358
  #endif
359
+ this->set_state_(State::STATE_STOPPING);
362
360
  this->note_duration_ = 0;
363
361
  this->on_finished_playback_callback_.call();
364
362
  ESP_LOGD(TAG, "Playback finished");
@@ -1,9 +1,5 @@
1
1
  #pragma once
2
2
 
3
- #include <stddef.h>
4
- #include <cstdint>
5
- #include <vector>
6
-
7
3
  namespace esphome {
8
4
  namespace speaker {
9
5
 
@@ -480,7 +480,7 @@ void HOT WaveshareEPaperTypeA::display() {
480
480
  this->start_data_();
481
481
  switch (this->model_) {
482
482
  case TTGO_EPAPER_2_13_IN_B1: { // block needed because of variable initializations
483
- int16_t wb = ((this->get_width_controller()) >> 3);
483
+ int16_t wb = ((this->get_width_internal()) >> 3);
484
484
  for (int i = 0; i < this->get_height_internal(); i++) {
485
485
  for (int j = 0; j < wb; j++) {
486
486
  int idx = j + (this->get_height_internal() - 1 - i) * wb;
@@ -766,7 +766,7 @@ void WaveshareEPaper2P7InV2::initialize() {
766
766
  // XRAM_START_AND_END_POSITION
767
767
  this->command(0x44);
768
768
  this->data(0x00);
769
- this->data(((this->get_width_controller() - 1) >> 3) & 0xFF);
769
+ this->data(((get_width_internal() - 1) >> 3) & 0xFF);
770
770
  // YRAM_START_AND_END_POSITION
771
771
  this->command(0x45);
772
772
  this->data(0x00);
@@ -928,8 +928,8 @@ void HOT WaveshareEPaper2P7InB::display() {
928
928
 
929
929
  // TCON_RESOLUTION
930
930
  this->command(0x61);
931
- this->data(this->get_width_controller() >> 8);
932
- this->data(this->get_width_controller() & 0xff); // 176
931
+ this->data(this->get_width_internal() >> 8);
932
+ this->data(this->get_width_internal() & 0xff); // 176
933
933
  this->data(this->get_height_internal() >> 8);
934
934
  this->data(this->get_height_internal() & 0xff); // 264
935
935
 
@@ -994,7 +994,7 @@ void WaveshareEPaper2P7InBV2::initialize() {
994
994
  // self.SetWindows(0, 0, self.width-1, self.height-1)
995
995
  // SetWindows(self, Xstart, Ystart, Xend, Yend):
996
996
 
997
- uint32_t xend = this->get_width_controller() - 1;
997
+ uint32_t xend = this->get_width_internal() - 1;
998
998
  uint32_t yend = this->get_height_internal() - 1;
999
999
  this->command(0x44);
1000
1000
  this->data(0x00);
@@ -1864,7 +1864,7 @@ def maybe_simple_value(*validators, **kwargs):
1864
1864
  if value == SCHEMA_EXTRACT:
1865
1865
  return (validator, key)
1866
1866
 
1867
- if isinstance(value, dict) and key in value:
1867
+ if isinstance(value, dict):
1868
1868
  return validator(value)
1869
1869
  return validator({key: value})
1870
1870
 
esphome/const.py CHANGED
@@ -1,6 +1,6 @@
1
1
  """Constants used by esphome."""
2
2
 
3
- __version__ = "2024.8.0"
3
+ __version__ = "2024.8.0b2"
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: 2024.8.0
3
+ Version: 2024.8.0b2
4
4
  Summary: Make creating custom firmwares for ESP32/ESP8266 super easy.
5
5
  Author-email: The ESPHome Authors <esphome@nabucasa.com>
6
6
  License: MIT
@@ -4,8 +4,8 @@ esphome/automation.py,sha256=5Ctd9-x3snlo582SHBy5WQISH5e6-8Mt9b7emxJyWiM,14507
4
4
  esphome/codegen.py,sha256=GePHUM7xdXb_Pil59SHVsXg2F4VBPgkH-Fz2PDX8Z54,1873
5
5
  esphome/config.py,sha256=ArMupdqCpKqQm-vFWb85HueI88DAfYTjuhR6mA691DI,39614
6
6
  esphome/config_helpers.py,sha256=MKf_wzO35nn41FvigXE0iYKDslPgL2ruf8R-EPtTT2I,3256
7
- esphome/config_validation.py,sha256=Uck0GvA97sJ6sW25y0nqvOT2nsYIb6uZ_1sI-YBl4vc,65844
8
- esphome/const.py,sha256=L9RaVFBT5n3eEJ_Y8cllO67bDj1S53CMlpcbx612KIs,39408
7
+ esphome/config_validation.py,sha256=mMpuN14yszcnKweuJjvG1f2IibZPXwfAommZoliNpyg,65827
8
+ esphome/const.py,sha256=OnMxq49qcVWv6uYfNYxbT3ak0pzDxh7s-RzH2nZ9pIA,39410
9
9
  esphome/coroutine.py,sha256=j_14z8dIIzIBeuNO30D4c1RJvMMt1xZFZ58Evd-EvJA,9344
10
10
  esphome/cpp_generator.py,sha256=lXPXHYUsFIvBSAoZ93mXYlGcXYg5L18nTtYGHE4_rr8,31203
11
11
  esphome/cpp_helpers.py,sha256=6C2vNbOIhZKi43xRVlk5hp9GfshfBn-rc5D_ZFUEYaE,4801
@@ -728,7 +728,7 @@ esphome/components/ens210/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
728
728
  esphome/components/ens210/ens210.cpp,sha256=ZFc51aAks8P3bCKi5EkkQaueYIf5C4i4YmDfCUJbzU0,8377
729
729
  esphome/components/ens210/ens210.h,sha256=yhCaQwB3GjeBYgOLXhuLCHELyjE3IrdL2e0Llfw9HU8,1545
730
730
  esphome/components/ens210/sensor.py,sha256=_ES1FNSEIwmZLNNzqUV_nGvjPx-i_j2pblAe6vg8f9M,1724
731
- esphome/components/esp32/__init__.py,sha256=B5Pvrw65UmbJFIV7sGjRoXROXM1Gb10UY1mluhWx6nc,26747
731
+ esphome/components/esp32/__init__.py,sha256=Bz4ASUxPrD0ccNW3A8XJXo7FWCvO1JqcgdOdNWG4zWA,26180
732
732
  esphome/components/esp32/boards.py,sha256=Fbn1QarvNqIbPV_yDTap128ZHszZiExIhK3wjQUS6w8,42736
733
733
  esphome/components/esp32/const.py,sha256=2yxLQg3p2-S3nRL6-zsF_dICrP_6waUfY5k8EFsoyVM,966
734
734
  esphome/components/esp32/core.cpp,sha256=GfidaExP8kU7ODM1S_VI9c3tQtmG2TaKwLJ-zzeSqd4,2413
@@ -1389,16 +1389,16 @@ esphome/components/ltr_als_ps/ltr_definitions.h,sha256=yaIvnLQBIBnPuQBvHDD9Q_16U
1389
1389
  esphome/components/ltr_als_ps/sensor.py,sha256=e5KnfruXbVI0s1S0bLJihTnIM5UOmiQT2dMRHxFReAM,10023
1390
1390
  esphome/components/lvgl/__init__.py,sha256=CxVEe3eNnpPlIGc4rl8wiNPI4GXKrQxn1i5lt7L7OsM,12430
1391
1391
  esphome/components/lvgl/automation.py,sha256=5BDOa0alZsraUcWgoh-QHsZDBtuzPrdU4VgiQIuL1oQ,7261
1392
- esphome/components/lvgl/defines.py,sha256=DxFTnt42o9eLRExvIUqzkmcVN-4nMBF6YSewxynfo_s,12183
1392
+ esphome/components/lvgl/defines.py,sha256=dlAnClIO2QDnrKPMJdwtVVgLq712CFg-7pnAB1UlwuA,12196
1393
1393
  esphome/components/lvgl/encoders.py,sha256=b8E__Bu4OJj8_svtgiHE8hfL78WSJIAuGo_JpmlVf5I,3088
1394
1394
  esphome/components/lvgl/font.cpp,sha256=l9dPIw7LdOdtg_3QZErTLLevMc6A66Wfm-1s-6qcBmM,2712
1395
1395
  esphome/components/lvgl/helpers.py,sha256=XI3C5IHwoSVlgR32kMxeXTZWK6iW112nmWv5wByrKLY,1253
1396
- esphome/components/lvgl/lv_validation.py,sha256=aGWc0YBZCZjYIgwYwE83vnROFiaMJf6Fo9db1Sas6Jc,8995
1396
+ esphome/components/lvgl/lv_validation.py,sha256=cXlzMVhA_O4ANGDeIKqTBdICcPMQalhkVgG3pKZu6V0,7780
1397
1397
  esphome/components/lvgl/lvcode.py,sha256=uUxJ-tGqo-fZdLaumXbAI4ElQh6P_IS8dD6eLtvwogo,10103
1398
1398
  esphome/components/lvgl/lvgl_esphome.cpp,sha256=yqEZdGmaUP6p5QRfQ7mq3_V3Mk7y431eK9EzlivmJnY,14150
1399
1399
  esphome/components/lvgl/lvgl_esphome.h,sha256=hsJml28BdPNyTaxdmf-EspzSzSFiLXTZB7Jgd-v00ws,9134
1400
1400
  esphome/components/lvgl/lvgl_hal.h,sha256=aZqWpSmKKAB-ZfNxxgxjgASTtLpAZjXJKuoTiPB0qqU,431
1401
- esphome/components/lvgl/schemas.py,sha256=CmENCi8w-gO7bvJB0mw5LAhk_dxSNchjOvqwUu7v4TE,14045
1401
+ esphome/components/lvgl/schemas.py,sha256=hMFIjfgHpgVA5BS5on7F2VPP59KP9AdlomibmaBhRxU,13503
1402
1402
  esphome/components/lvgl/styles.py,sha256=DauT2qibb5vJMbejaUnhQ6OHEmDJkcjY9yctl4GrcCw,2167
1403
1403
  esphome/components/lvgl/touchscreens.py,sha256=R2tkfse86qzWDU6Ot_tARApWfn1jeFaJObDUX5gITL8,1634
1404
1404
  esphome/components/lvgl/trigger.py,sha256=bUdmvSH-mEPCzdcJQuyedq0oIIYvMOzzGit_5zdjCmA,2269
@@ -1416,7 +1416,7 @@ esphome/components/lvgl/switch/lvgl_switch.h,sha256=w8SqlodBYRdVzlhBwkBERRP-X-Ir
1416
1416
  esphome/components/lvgl/text/__init__.py,sha256=SfNxKSwBrV_HYjZjLWKvOU3aum8t4hBuHh-erfypy58,1530
1417
1417
  esphome/components/lvgl/text/lvgl_text.h,sha256=KZrcwh3G0wADH9hg4byTpF1pk67x5cn9zHWOwv_G5YY,883
1418
1418
  esphome/components/lvgl/text_sensor/__init__.py,sha256=Xz4hfnrRdaxkIjyF2B3w2eX1Py3VcH7Mk1Jy6za5FBY,1200
1419
- esphome/components/lvgl/widgets/__init__.py,sha256=N2fLNSexPZuJkqPIKR_4IXJXMxJlAWHcmoV7L5S2qlA,13065
1419
+ esphome/components/lvgl/widgets/__init__.py,sha256=NIw3cDHk3CZij_S58Tq4UHHvheYWN-k83eHGVAc6uDQ,12342
1420
1420
  esphome/components/lvgl/widgets/animimg.py,sha256=-dsL4TJ5k3defNUiLIE6xads3pH1I1T5Bmnn7uKcQZ8,3395
1421
1421
  esphome/components/lvgl/widgets/arc.py,sha256=M7T1iU_dhjnHJSSm-DW0u7RSZAgAQwycBxifODPbTyw,2305
1422
1422
  esphome/components/lvgl/widgets/button.py,sha256=lR_8dHZK3P9AY6WbjfL3Sj9oyTOf-i9qbvkGzcPpzgk,423
@@ -1606,7 +1606,7 @@ esphome/components/micronova/text_sensor/micronova_text_sensor.cpp,sha256=-ycHe4
1606
1606
  esphome/components/micronova/text_sensor/micronova_text_sensor.h,sha256=6_tjKN6nxn8_Mf6VOW-TAyDtZci602ljxqnifsOaD8I,681
1607
1607
  esphome/components/microphone/__init__.py,sha256=YKpTAy9uvPbHkb4faSk9EA0ltuEATseZFdjh3N2nWQM,2491
1608
1608
  esphome/components/microphone/automation.h,sha256=MSdGq7kqFJlWC-bMn97SG7DItrXOrJ-kRiDr6QsRkes,929
1609
- esphome/components/microphone/microphone.h,sha256=j_ILMqRG29PXcr5Q5IxdBAghRvuajix2eXkUhIwahNs,874
1609
+ esphome/components/microphone/microphone.h,sha256=wdiIL0brbxHp2HqXRnKFUISVWfwgsPTs10Y6O_jr4xI,833
1610
1610
  esphome/components/mics_4514/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1611
1611
  esphome/components/mics_4514/mics_4514.cpp,sha256=jm7s2NSDVOW3_Gy0X77GkgoDgPhAT1__7f3U2zaAMWk,4335
1612
1612
  esphome/components/mics_4514/mics_4514.h,sha256=w3vtAl_ErB-j_-fl6Lk4U7cShwwlRgfbKQrb3liekNs,746
@@ -2211,8 +2211,8 @@ esphome/components/rp2040/preferences.cpp,sha256=tSFwd7RWmbkJSfOUcq_y6rlNXpSxGlB
2211
2211
  esphome/components/rp2040/preferences.h,sha256=z7zFhLXLLmURu5RNaAlOpPIv2TnK8cvrGkGAyz0LvjM,216
2212
2212
  esphome/components/rp2040_pio/__init__.py,sha256=tKUlvHo2khh10A_LFOMuIc7MPswajSzz4FrVlYaGRw8,1244
2213
2213
  esphome/components/rp2040_pio_led_strip/__init__.py,sha256=QcyctD5MgxIKzfSZKAehNf2_W40eHvppWidpWMeDBHc,28
2214
- esphome/components/rp2040_pio_led_strip/led_strip.cpp,sha256=ShiIeHQkA6ewjJL8QnKqKFq6w2N0ESxsA9xchK5bn_Y,7793
2215
- esphome/components/rp2040_pio_led_strip/led_strip.h,sha256=G9aW-Wh9jbqXiXop2sW6BTrRfRzjgwLGmSzefdzv_-k,3450
2214
+ esphome/components/rp2040_pio_led_strip/led_strip.cpp,sha256=SWyDRMJL4UhlwWNhz8JHpAiAbCul4OVNhYcgoqoSDFg,6329
2215
+ esphome/components/rp2040_pio_led_strip/led_strip.h,sha256=eha9Bf-dEkvFIjlErEvv8fR1f8QTGcjZbrSKBvDsxgA,3277
2216
2216
  esphome/components/rp2040_pio_led_strip/light.py,sha256=7tF4FNmHwewBvPuGJMs2kFtITUeOIZ9Tfgt0UD4MAR4,7925
2217
2217
  esphome/components/rp2040_pwm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2218
2218
  esphome/components/rp2040_pwm/output.py,sha256=dU5-CZL5z_jvSf3cbJs4czckKvPmn1ifV5Th1zdqECk,1747
@@ -2225,7 +2225,7 @@ esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.h,sha256=wQwb2lt50tVEkQ53Pj6Bm-KCGlc4
2225
2225
  esphome/components/rtl87xx/__init__.py,sha256=HIcczzFYGdNtOj635-gH0VVmBOZjmvcS4mxFWdlPtBo,1362
2226
2226
  esphome/components/rtl87xx/boards.py,sha256=JItSPj4n2UAvUXISoL2PTyTAqIi2Wp3sjGjs1fgS-3M,29269
2227
2227
  esphome/components/rtttl/__init__.py,sha256=m8vjSNfwcgbJm6NhDe_ErddMMwUpe2StubWcMY8sd28,4383
2228
- esphome/components/rtttl/rtttl.cpp,sha256=CxERszdc_mzMr-RPaI-vq0dQhmEoiMnV6cXiyCl1N_s,10865
2228
+ esphome/components/rtttl/rtttl.cpp,sha256=RbVz9upUhTCqoPMnQjLUDmDzuEBlA6yWKQ2Ml_aTxts,10779
2229
2229
  esphome/components/rtttl/rtttl.h,sha256=8xnisjG4Glm8JhCDB-RIyyS0yySGCLRsLnT24brQtYs,2946
2230
2230
  esphome/components/ruuvi_ble/__init__.py,sha256=9LmcfStqBeEzcuWdON_iGuI6Xh0BUssV1Aebv98Krks,619
2231
2231
  esphome/components/ruuvi_ble/ruuvi_ble.cpp,sha256=XXeYIgr1OB20MxtdcTDAWowFeK8qRQmQKTMeSEuhAec,5724
@@ -2474,7 +2474,7 @@ esphome/components/sonoff_d1/sonoff_d1.cpp,sha256=9xT42oxeLJ5CGrZ7wqIH5KVTkwW3XY
2474
2474
  esphome/components/sonoff_d1/sonoff_d1.h,sha256=FNHcaqGktpV3S19A1LD2wtpRpEqA0h6g9GFb36pMy_E,3457
2475
2475
  esphome/components/speaker/__init__.py,sha256=NE8RYnynPb2TAQ9dW5k-jMbDliJoRCqotJxIMawGdQg,2732
2476
2476
  esphome/components/speaker/automation.h,sha256=bpp8rraMm1A0C4r0PfELw4fI9TySyrg4GPQgoBzF9SE,1584
2477
- esphome/components/speaker/speaker.h,sha256=cLRt67zz0KOSuPSdpJOOioQIHWu6bUneZQSiyj4WuM4,1018
2477
+ esphome/components/speaker/speaker.h,sha256=5LL4_IrQ9NQZ1mmrZEHHnB34QeSNWHooUdZnntTLmLM,960
2478
2478
  esphome/components/speed/__init__.py,sha256=Bfyz1MHHvLHj93TfN53E2uhKXKLYtp0k4st6Xb3760o,74
2479
2479
  esphome/components/speed/fan/__init__.py,sha256=zhurjCYLG9V-soV-LF4mEGxqyrcQuQ_KLdFq0LpyAKA,1798
2480
2480
  esphome/components/speed/fan/speed_fan.cpp,sha256=vjrhZZ4Rto6uEmw8396tF9QrAXZvZSKKiIC-_T2LtYc,1472
@@ -2970,7 +2970,7 @@ esphome/components/watchdog/watchdog.h,sha256=8Ro3Kgi9C1bYFBkNEeKc188EK63uI48Vuz
2970
2970
  esphome/components/waveshare_epaper/__init__.py,sha256=4Nn7UhpMJ9oSbuLdyVEW7G9PlIey2v33SWRNVizt9Oc,30
2971
2971
  esphome/components/waveshare_epaper/display.py,sha256=csFJ_y-O30w4_JJ75N-RP5VKTS8mMf45imk-yOW6_hg,8425
2972
2972
  esphome/components/waveshare_epaper/waveshare_213v3.cpp,sha256=DoXF6L9B2RodhIsCQ0myNycanrT50lx0JwxzW4Lluf4,7293
2973
- esphome/components/waveshare_epaper/waveshare_epaper.cpp,sha256=Ejvjvz-tKd9zF3MXjwCViEwXdqicxCPWn2zlSEPNues,93334
2973
+ esphome/components/waveshare_epaper/waveshare_epaper.cpp,sha256=HAAr5VftK02f8L_UFnB5aR0DBXZ3We6E4rJf5gKJVbo,93318
2974
2974
  esphome/components/waveshare_epaper/waveshare_epaper.h,sha256=DOI5LyxWob1x6Fqrwms0QvfsFVyRPzOF7gjv9f4nLK4,17990
2975
2975
  esphome/components/web_server/__init__.py,sha256=eAivKqka7nyjY-ZP9O2t6Tvm145fVJGh0Bgx9YkE3Sw,8627
2976
2976
  esphome/components/web_server/list_entities.cpp,sha256=PXfaW687audOXB2Gdx2Dtn2-J2XTbbQQgY_FivqE6DU,6214
@@ -3225,9 +3225,9 @@ esphome/dashboard/util/itertools.py,sha256=8eLrWEWmICLtXNxkKdYPQV0c_N4GEz8m9Npnb
3225
3225
  esphome/dashboard/util/password.py,sha256=cQz3b9B-ijTe7zS6BeCW0hc3pWv6JjC78jmnycYYAh8,321
3226
3226
  esphome/dashboard/util/subprocess.py,sha256=T8EW6dbU4LPd2DG1dRrdh8li71tt6J1isn411poMhkk,1022
3227
3227
  esphome/dashboard/util/text.py,sha256=ENDnfN4O0NdA3CKVJjQYabFbwbrsIhVKrAMQe53qYu4,534
3228
- esphome-2024.8.0.dist-info/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3229
- esphome-2024.8.0.dist-info/METADATA,sha256=dhcua8pu8eFhFEEDy43vxZh6xj6kEaVu38zYmEykLgk,3263
3230
- esphome-2024.8.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
3231
- esphome-2024.8.0.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3232
- esphome-2024.8.0.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3233
- esphome-2024.8.0.dist-info/RECORD,,
3228
+ esphome-2024.8.0b2.dist-info/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
3229
+ esphome-2024.8.0b2.dist-info/METADATA,sha256=JACkKX-kcjNpHwsw05HK7NX06baqhoQcYjqLv1y4oY8,3265
3230
+ esphome-2024.8.0b2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
3231
+ esphome-2024.8.0b2.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
3232
+ esphome-2024.8.0b2.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
3233
+ esphome-2024.8.0b2.dist-info/RECORD,,