esphome 2024.8.0__py3-none-any.whl → 2024.8.0b1__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/__init__.py +1 -1
- esphome/components/esp32/__init__.py +0 -13
- esphome/components/host/__init__.py +7 -3
- esphome/components/light/esp_color_correction.h +8 -8
- esphome/components/lvgl/defines.py +14 -18
- esphome/components/lvgl/lv_validation.py +31 -55
- esphome/components/lvgl/schemas.py +11 -21
- esphome/components/lvgl/widgets/__init__.py +2 -21
- esphome/components/microphone/microphone.h +1 -4
- esphome/components/network/__init__.py +1 -5
- esphome/components/remote_base/pronto_protocol.cpp +3 -0
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +5 -31
- esphome/components/rp2040_pio_led_strip/led_strip.h +0 -5
- esphome/components/rtttl/rtttl.cpp +21 -108
- esphome/components/rtttl/rtttl.h +6 -15
- esphome/components/speaker/speaker.h +0 -4
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +5 -5
- esphome/config_validation.py +0 -14
- esphome/const.py +1 -1
- {esphome-2024.8.0.dist-info → esphome-2024.8.0b1.dist-info}/METADATA +1 -1
- {esphome-2024.8.0.dist-info → esphome-2024.8.0b1.dist-info}/RECORD +25 -25
- {esphome-2024.8.0.dist-info → esphome-2024.8.0b1.dist-info}/LICENSE +0 -0
- {esphome-2024.8.0.dist-info → esphome-2024.8.0b1.dist-info}/WHEEL +0 -0
- {esphome-2024.8.0.dist-info → esphome-2024.8.0b1.dist-info}/entry_points.txt +0 -0
- {esphome-2024.8.0.dist-info → esphome-2024.8.0b1.dist-info}/top_level.txt +0 -0
@@ -155,7 +155,7 @@ async def to_code(config):
|
|
155
155
|
decoded = base64.b64decode(encryption_config[CONF_KEY])
|
156
156
|
cg.add(var.set_noise_psk(list(decoded)))
|
157
157
|
cg.add_define("USE_API_NOISE")
|
158
|
-
cg.add_library("esphome/noise-c", "0.1.
|
158
|
+
cg.add_library("esphome/noise-c", "0.1.4")
|
159
159
|
else:
|
160
160
|
cg.add_define("USE_API_PLAINTEXT")
|
161
161
|
|
@@ -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):
|
@@ -1,14 +1,15 @@
|
|
1
|
-
import esphome.codegen as cg
|
2
|
-
import esphome.config_validation as cv
|
3
1
|
from esphome.const import (
|
4
|
-
CONF_MAC_ADDRESS,
|
5
2
|
KEY_CORE,
|
6
3
|
KEY_FRAMEWORK_VERSION,
|
7
4
|
KEY_TARGET_FRAMEWORK,
|
8
5
|
KEY_TARGET_PLATFORM,
|
9
6
|
PLATFORM_HOST,
|
7
|
+
CONF_MAC_ADDRESS,
|
10
8
|
)
|
11
9
|
from esphome.core import CORE
|
10
|
+
from esphome.helpers import IS_MACOS
|
11
|
+
import esphome.config_validation as cv
|
12
|
+
import esphome.codegen as cg
|
12
13
|
|
13
14
|
from .const import KEY_HOST
|
14
15
|
|
@@ -41,5 +42,8 @@ async def to_code(config):
|
|
41
42
|
cg.add_build_flag("-DUSE_HOST")
|
42
43
|
cg.add_define("USE_ESPHOME_HOST_MAC_ADDRESS", config[CONF_MAC_ADDRESS].parts)
|
43
44
|
cg.add_build_flag("-std=c++17")
|
45
|
+
cg.add_build_flag("-lsodium")
|
46
|
+
if IS_MACOS:
|
47
|
+
cg.add_build_flag("-L/opt/homebrew/lib")
|
44
48
|
cg.add_define("ESPHOME_BOARD", "host")
|
45
49
|
cg.add_platformio_option("platform", "platformio/native")
|
@@ -41,29 +41,29 @@ class ESPColorCorrection {
|
|
41
41
|
if (this->max_brightness_.red == 0 || this->local_brightness_ == 0)
|
42
42
|
return 0;
|
43
43
|
uint16_t uncorrected = this->gamma_reverse_table_[red] * 255UL;
|
44
|
-
|
45
|
-
return
|
44
|
+
uint8_t res = ((uncorrected / this->max_brightness_.red) * 255UL) / this->local_brightness_;
|
45
|
+
return res;
|
46
46
|
}
|
47
47
|
inline uint8_t color_uncorrect_green(uint8_t green) const ESPHOME_ALWAYS_INLINE {
|
48
48
|
if (this->max_brightness_.green == 0 || this->local_brightness_ == 0)
|
49
49
|
return 0;
|
50
50
|
uint16_t uncorrected = this->gamma_reverse_table_[green] * 255UL;
|
51
|
-
|
52
|
-
return
|
51
|
+
uint8_t res = ((uncorrected / this->max_brightness_.green) * 255UL) / this->local_brightness_;
|
52
|
+
return res;
|
53
53
|
}
|
54
54
|
inline uint8_t color_uncorrect_blue(uint8_t blue) const ESPHOME_ALWAYS_INLINE {
|
55
55
|
if (this->max_brightness_.blue == 0 || this->local_brightness_ == 0)
|
56
56
|
return 0;
|
57
57
|
uint16_t uncorrected = this->gamma_reverse_table_[blue] * 255UL;
|
58
|
-
|
59
|
-
return
|
58
|
+
uint8_t res = ((uncorrected / this->max_brightness_.blue) * 255UL) / this->local_brightness_;
|
59
|
+
return res;
|
60
60
|
}
|
61
61
|
inline uint8_t color_uncorrect_white(uint8_t white) const ESPHOME_ALWAYS_INLINE {
|
62
62
|
if (this->max_brightness_.white == 0 || this->local_brightness_ == 0)
|
63
63
|
return 0;
|
64
64
|
uint16_t uncorrected = this->gamma_reverse_table_[white] * 255UL;
|
65
|
-
|
66
|
-
return
|
65
|
+
uint8_t res = ((uncorrected / this->max_brightness_.white) * 255UL) / this->local_brightness_;
|
66
|
+
return res;
|
67
67
|
}
|
68
68
|
|
69
69
|
protected:
|
@@ -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
|
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__(
|
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
|
-
|
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
|
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,
|
9
|
-
from esphome.core import HexInt
|
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
|
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 ["
|
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
|
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(
|
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_,
|
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__(
|
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)
|
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
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
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(
|
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
|
-
|
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.
|
129
|
-
"outline_width": lvalid.
|
130
|
-
"pad_all": lvalid.
|
131
|
-
"pad_bottom": lvalid.
|
132
|
-
"
|
133
|
-
"
|
134
|
-
"
|
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
|
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(
|
351
|
+
with LvConditional(f"{lamb}()") as cond:
|
371
352
|
w.add_state(state)
|
372
353
|
cond.else_()
|
373
354
|
w.clear_state(state)
|
@@ -24,11 +24,7 @@ CONFIG_SCHEMA = cv.Schema(
|
|
24
24
|
esp32=False,
|
25
25
|
rp2040=False,
|
26
26
|
): cv.All(
|
27
|
-
cv.boolean,
|
28
|
-
cv.Any(
|
29
|
-
cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266, PLATFORM_RP2040]),
|
30
|
-
cv.boolean_false,
|
31
|
-
),
|
27
|
+
cv.boolean, cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266, PLATFORM_RP2040])
|
32
28
|
),
|
33
29
|
cv.Optional(CONF_MIN_IPV6_ADDR_COUNT, default=0): cv.positive_int,
|
34
30
|
}
|
@@ -201,6 +201,9 @@ std::string ProntoProtocol::compensate_and_dump_sequence_(const RawTimings &data
|
|
201
201
|
out += dump_duration_(t_duration, timebase);
|
202
202
|
}
|
203
203
|
|
204
|
+
// append minimum gap
|
205
|
+
out += dump_duration_(PRONTO_DEFAULT_GAP, timebase, true);
|
206
|
+
|
204
207
|
return out;
|
205
208
|
}
|
206
209
|
|
@@ -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 (
|
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
|
-
|
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 =
|
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
|
-
|
90
|
-
|
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
|
@@ -29,13 +29,6 @@ inline double deg2rad(double degrees) {
|
|
29
29
|
void Rtttl::dump_config() { ESP_LOGCONFIG(TAG, "Rtttl"); }
|
30
30
|
|
31
31
|
void Rtttl::play(std::string rtttl) {
|
32
|
-
if (this->state_ != State::STATE_STOPPED && this->state_ != State::STATE_STOPPING) {
|
33
|
-
int pos = this->rtttl_.find(':');
|
34
|
-
auto name = this->rtttl_.substr(0, pos);
|
35
|
-
ESP_LOGW(TAG, "RTTTL Component is already playing: %s", name.c_str());
|
36
|
-
return;
|
37
|
-
}
|
38
|
-
|
39
32
|
this->rtttl_ = std::move(rtttl);
|
40
33
|
|
41
34
|
this->default_duration_ = 4;
|
@@ -105,24 +98,16 @@ void Rtttl::play(std::string rtttl) {
|
|
105
98
|
this->note_duration_ = 1;
|
106
99
|
|
107
100
|
#ifdef USE_SPEAKER
|
108
|
-
|
109
|
-
|
110
|
-
this->samples_sent_ = 0;
|
111
|
-
this->samples_count_ = 0;
|
112
|
-
}
|
113
|
-
#endif
|
114
|
-
#ifdef USE_OUTPUT
|
115
|
-
if (this->output_ != nullptr) {
|
116
|
-
this->set_state_(State::STATE_RUNNING);
|
117
|
-
}
|
101
|
+
this->samples_sent_ = 0;
|
102
|
+
this->samples_count_ = 0;
|
118
103
|
#endif
|
119
104
|
}
|
120
105
|
|
121
106
|
void Rtttl::stop() {
|
107
|
+
this->note_duration_ = 0;
|
122
108
|
#ifdef USE_OUTPUT
|
123
109
|
if (this->output_ != nullptr) {
|
124
110
|
this->output_->set_level(0.0);
|
125
|
-
this->set_state_(STATE_STOPPED);
|
126
111
|
}
|
127
112
|
#endif
|
128
113
|
#ifdef USE_SPEAKER
|
@@ -130,37 +115,18 @@ void Rtttl::stop() {
|
|
130
115
|
if (this->speaker_->is_running()) {
|
131
116
|
this->speaker_->stop();
|
132
117
|
}
|
133
|
-
this->set_state_(STATE_STOPPING);
|
134
118
|
}
|
135
119
|
#endif
|
136
|
-
this->note_duration_ = 0;
|
137
120
|
}
|
138
121
|
|
139
122
|
void Rtttl::loop() {
|
140
|
-
if (this->note_duration_ == 0
|
123
|
+
if (this->note_duration_ == 0)
|
141
124
|
return;
|
142
125
|
|
143
126
|
#ifdef USE_SPEAKER
|
144
127
|
if (this->speaker_ != nullptr) {
|
145
|
-
if (this->state_ == State::STATE_STOPPING) {
|
146
|
-
if (this->speaker_->is_stopped()) {
|
147
|
-
this->set_state_(State::STATE_STOPPED);
|
148
|
-
}
|
149
|
-
} else if (this->state_ == State::STATE_INIT) {
|
150
|
-
if (this->speaker_->is_stopped()) {
|
151
|
-
this->speaker_->start();
|
152
|
-
this->set_state_(State::STATE_STARTING);
|
153
|
-
}
|
154
|
-
} else if (this->state_ == State::STATE_STARTING) {
|
155
|
-
if (this->speaker_->is_running()) {
|
156
|
-
this->set_state_(State::STATE_RUNNING);
|
157
|
-
}
|
158
|
-
}
|
159
|
-
if (!this->speaker_->is_running()) {
|
160
|
-
return;
|
161
|
-
}
|
162
128
|
if (this->samples_sent_ != this->samples_count_) {
|
163
|
-
SpeakerSample sample[SAMPLE_BUFFER_SIZE +
|
129
|
+
SpeakerSample sample[SAMPLE_BUFFER_SIZE + 1];
|
164
130
|
int x = 0;
|
165
131
|
double rem = 0.0;
|
166
132
|
|
@@ -170,7 +136,7 @@ void Rtttl::loop() {
|
|
170
136
|
if (this->samples_per_wave_ != 0 && this->samples_sent_ >= this->samples_gap_) { // Play note//
|
171
137
|
rem = ((this->samples_sent_ << 10) % this->samples_per_wave_) * (360.0 / this->samples_per_wave_);
|
172
138
|
|
173
|
-
int16_t val = (
|
139
|
+
int16_t val = (49152 * this->gain_) * sin(deg2rad(rem));
|
174
140
|
|
175
141
|
sample[x].left = val;
|
176
142
|
sample[x].right = val;
|
@@ -187,9 +153,9 @@ void Rtttl::loop() {
|
|
187
153
|
x++;
|
188
154
|
}
|
189
155
|
if (x > 0) {
|
190
|
-
int send = this->speaker_->play((uint8_t *) (&sample), x *
|
156
|
+
int send = this->speaker_->play((uint8_t *) (&sample), x * 4);
|
191
157
|
if (send != x * 4) {
|
192
|
-
this->samples_sent_ -= (x - (send /
|
158
|
+
this->samples_sent_ -= (x - (send / 4));
|
193
159
|
}
|
194
160
|
return;
|
195
161
|
}
|
@@ -201,7 +167,14 @@ void Rtttl::loop() {
|
|
201
167
|
return;
|
202
168
|
#endif
|
203
169
|
if (!this->rtttl_[position_]) {
|
204
|
-
this->
|
170
|
+
this->note_duration_ = 0;
|
171
|
+
#ifdef USE_OUTPUT
|
172
|
+
if (this->output_ != nullptr) {
|
173
|
+
this->output_->set_level(0.0);
|
174
|
+
}
|
175
|
+
#endif
|
176
|
+
ESP_LOGD(TAG, "Playback finished");
|
177
|
+
this->on_finished_playback_callback_.call();
|
205
178
|
return;
|
206
179
|
}
|
207
180
|
|
@@ -240,7 +213,6 @@ void Rtttl::loop() {
|
|
240
213
|
case 'a':
|
241
214
|
note = 10;
|
242
215
|
break;
|
243
|
-
case 'h':
|
244
216
|
case 'b':
|
245
217
|
note = 12;
|
246
218
|
break;
|
@@ -266,21 +238,14 @@ void Rtttl::loop() {
|
|
266
238
|
uint8_t scale = get_integer_();
|
267
239
|
if (scale == 0)
|
268
240
|
scale = this->default_octave_;
|
269
|
-
|
270
|
-
if (scale < 4 || scale > 7) {
|
271
|
-
ESP_LOGE(TAG, "Octave out of valid range. Should be between 4 and 7. (Octave: %d)", scale);
|
272
|
-
this->finish_();
|
273
|
-
return;
|
274
|
-
}
|
275
241
|
bool need_note_gap = false;
|
276
242
|
|
277
243
|
// Now play the note
|
278
244
|
if (note) {
|
279
245
|
auto note_index = (scale - 4) * 12 + note;
|
280
246
|
if (note_index < 0 || note_index >= (int) sizeof(NOTES)) {
|
281
|
-
ESP_LOGE(TAG, "Note out of valid range
|
282
|
-
|
283
|
-
this->finish_();
|
247
|
+
ESP_LOGE(TAG, "Note out of valid range");
|
248
|
+
this->note_duration_ = 0;
|
284
249
|
return;
|
285
250
|
}
|
286
251
|
auto freq = NOTES[note_index];
|
@@ -320,17 +285,14 @@ void Rtttl::loop() {
|
|
320
285
|
this->samples_gap_ = (this->sample_rate_ * DOUBLE_NOTE_GAP_MS) / 1600; //(ms);
|
321
286
|
}
|
322
287
|
if (this->output_freq_ != 0) {
|
323
|
-
// make sure there is enough samples to add a full last sinus.
|
324
|
-
|
325
|
-
uint16_t samples_wish = this->samples_count_;
|
326
288
|
this->samples_per_wave_ = (this->sample_rate_ << 10) / this->output_freq_;
|
327
289
|
|
290
|
+
// make sure there is enough samples to add a full last sinus.
|
328
291
|
uint16_t division = ((this->samples_count_ << 10) / this->samples_per_wave_) + 1;
|
329
|
-
|
292
|
+
uint16_t x = this->samples_count_;
|
330
293
|
this->samples_count_ = (division * this->samples_per_wave_);
|
294
|
+
ESP_LOGD(TAG, "play time old: %d div: %d new: %d %d", x, division, this->samples_count_, this->samples_per_wave_);
|
331
295
|
this->samples_count_ = this->samples_count_ >> 10;
|
332
|
-
ESP_LOGVV(TAG, "- Calc play time: wish: %d gets: %d (div: %d spw: %d)", samples_wish, this->samples_count_,
|
333
|
-
division, this->samples_per_wave_);
|
334
296
|
}
|
335
297
|
// Convert from frequency in Hz to high and low samples in fixed point
|
336
298
|
}
|
@@ -339,54 +301,5 @@ void Rtttl::loop() {
|
|
339
301
|
this->last_note_ = millis();
|
340
302
|
}
|
341
303
|
|
342
|
-
void Rtttl::finish_() {
|
343
|
-
#ifdef USE_OUTPUT
|
344
|
-
if (this->output_ != nullptr) {
|
345
|
-
this->output_->set_level(0.0);
|
346
|
-
this->set_state_(State::STATE_STOPPED);
|
347
|
-
}
|
348
|
-
#endif
|
349
|
-
#ifdef USE_SPEAKER
|
350
|
-
if (this->speaker_ != nullptr) {
|
351
|
-
SpeakerSample sample[2];
|
352
|
-
sample[0].left = 0;
|
353
|
-
sample[0].right = 0;
|
354
|
-
sample[1].left = 0;
|
355
|
-
sample[1].right = 0;
|
356
|
-
this->speaker_->play((uint8_t *) (&sample), 8);
|
357
|
-
|
358
|
-
this->speaker_->finish();
|
359
|
-
this->set_state_(State::STATE_STOPPING);
|
360
|
-
}
|
361
|
-
#endif
|
362
|
-
this->note_duration_ = 0;
|
363
|
-
this->on_finished_playback_callback_.call();
|
364
|
-
ESP_LOGD(TAG, "Playback finished");
|
365
|
-
}
|
366
|
-
|
367
|
-
static const LogString *state_to_string(State state) {
|
368
|
-
switch (state) {
|
369
|
-
case STATE_STOPPED:
|
370
|
-
return LOG_STR("STATE_STOPPED");
|
371
|
-
case STATE_STARTING:
|
372
|
-
return LOG_STR("STATE_STARTING");
|
373
|
-
case STATE_RUNNING:
|
374
|
-
return LOG_STR("STATE_RUNNING");
|
375
|
-
case STATE_STOPPING:
|
376
|
-
return LOG_STR("STATE_STOPPING");
|
377
|
-
case STATE_INIT:
|
378
|
-
return LOG_STR("STATE_INIT");
|
379
|
-
default:
|
380
|
-
return LOG_STR("UNKNOWN");
|
381
|
-
}
|
382
|
-
};
|
383
|
-
|
384
|
-
void Rtttl::set_state_(State state) {
|
385
|
-
State old_state = this->state_;
|
386
|
-
this->state_ = state;
|
387
|
-
ESP_LOGD(TAG, "State changed from %s to %s", LOG_STR_ARG(state_to_string(old_state)),
|
388
|
-
LOG_STR_ARG(state_to_string(state)));
|
389
|
-
}
|
390
|
-
|
391
304
|
} // namespace rtttl
|
392
305
|
} // namespace esphome
|
esphome/components/rtttl/rtttl.h
CHANGED
@@ -14,20 +14,12 @@
|
|
14
14
|
namespace esphome {
|
15
15
|
namespace rtttl {
|
16
16
|
|
17
|
-
enum State : uint8_t {
|
18
|
-
STATE_STOPPED = 0,
|
19
|
-
STATE_INIT,
|
20
|
-
STATE_STARTING,
|
21
|
-
STATE_RUNNING,
|
22
|
-
STATE_STOPPING,
|
23
|
-
};
|
24
|
-
|
25
17
|
#ifdef USE_SPEAKER
|
26
|
-
static const size_t SAMPLE_BUFFER_SIZE =
|
18
|
+
static const size_t SAMPLE_BUFFER_SIZE = 512;
|
27
19
|
|
28
20
|
struct SpeakerSample {
|
29
|
-
|
30
|
-
|
21
|
+
int16_t left{0};
|
22
|
+
int16_t right{0};
|
31
23
|
};
|
32
24
|
#endif
|
33
25
|
|
@@ -50,7 +42,7 @@ class Rtttl : public Component {
|
|
50
42
|
void stop();
|
51
43
|
void dump_config() override;
|
52
44
|
|
53
|
-
bool is_playing() { return this->
|
45
|
+
bool is_playing() { return this->note_duration_ != 0; }
|
54
46
|
void loop() override;
|
55
47
|
|
56
48
|
void add_on_finished_playback_callback(std::function<void()> callback) {
|
@@ -65,8 +57,6 @@ class Rtttl : public Component {
|
|
65
57
|
}
|
66
58
|
return ret;
|
67
59
|
}
|
68
|
-
void finish_();
|
69
|
-
void set_state_(State state);
|
70
60
|
|
71
61
|
std::string rtttl_{""};
|
72
62
|
size_t position_{0};
|
@@ -78,12 +68,13 @@ class Rtttl : public Component {
|
|
78
68
|
|
79
69
|
uint32_t output_freq_;
|
80
70
|
float gain_{0.6f};
|
81
|
-
State state_{State::STATE_STOPPED};
|
82
71
|
|
83
72
|
#ifdef USE_OUTPUT
|
84
73
|
output::FloatOutput *output_;
|
85
74
|
#endif
|
86
75
|
|
76
|
+
void play_output_();
|
77
|
+
|
87
78
|
#ifdef USE_SPEAKER
|
88
79
|
speaker::Speaker *speaker_{nullptr};
|
89
80
|
int sample_rate_{16000};
|
@@ -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->
|
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(((
|
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->
|
932
|
-
this->data(this->
|
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->
|
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);
|
esphome/config_validation.py
CHANGED
@@ -370,20 +370,6 @@ def boolean(value):
|
|
370
370
|
)
|
371
371
|
|
372
372
|
|
373
|
-
def boolean_false(value):
|
374
|
-
"""Validate the given config option to be a boolean, set to False.
|
375
|
-
|
376
|
-
This option allows a bunch of different ways of expressing boolean values:
|
377
|
-
- instance of boolean
|
378
|
-
- 'true'/'false'
|
379
|
-
- 'yes'/'no'
|
380
|
-
- 'enable'/disable
|
381
|
-
"""
|
382
|
-
if boolean(value):
|
383
|
-
raise Invalid("Expected boolean value to be false")
|
384
|
-
return False
|
385
|
-
|
386
|
-
|
387
373
|
@schema_extractor_list
|
388
374
|
def ensure_list(*validators):
|
389
375
|
"""Validate this configuration option to be a list.
|
esphome/const.py
CHANGED
@@ -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=
|
8
|
-
esphome/const.py,sha256=
|
7
|
+
esphome/config_validation.py,sha256=4cZR-RBzWzszUwLXGl9ArbMsi148OHNib6NuL-VdbSg,65466
|
8
|
+
esphome/const.py,sha256=exhwYf7fr1ZAUWdp2jF_OGEMcXHGRnGMLJ0JW4H6O4I,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
|
@@ -172,7 +172,7 @@ esphome/components/apds9960/apds9960.cpp,sha256=5KibjOjWcgl7Ywk-5UkGCeenkNcj3r3F
|
|
172
172
|
esphome/components/apds9960/apds9960.h,sha256=oFrXPQrPDS16gNSVdN1n6SKuvjwc9LdvpKJckr5Tbdc,2136
|
173
173
|
esphome/components/apds9960/binary_sensor.py,sha256=DcfxkwZFvgmOU3C_gVSfZOpJ-EZlZXMd0gHnAUnxxCs,786
|
174
174
|
esphome/components/apds9960/sensor.py,sha256=HoGfwl7WqJkpKI7BjeM1alXPcppdWVRrWwFzrZ0ISAo,871
|
175
|
-
esphome/components/api/__init__.py,sha256=
|
175
|
+
esphome/components/api/__init__.py,sha256=TV6hzCL8rRSiShpmqbNYYcvF-kTSltQY04S3OwFBKoc,9895
|
176
176
|
esphome/components/api/api_connection.cpp,sha256=bZ9AD5XLA3HwO8-faAGEvbiLSS89rKpUXdBJ9oYQeyw,56690
|
177
177
|
esphome/components/api/api_connection.h,sha256=5BPFRslCG0l-RwPjtt9xiwA0E7-3uT-US3_69xZiVFI,10323
|
178
178
|
esphome/components/api/api_frame_helper.cpp,sha256=-K3JLxUJ3gKpxVzJwOAwlCvlwl7C7VTgQWhpHlhzgd0,32998
|
@@ -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=
|
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
|
@@ -1068,7 +1068,7 @@ esphome/components/honeywellabp2_i2c/__init__.py,sha256=q4EX44dXWVPn_6bcR0pbzsGW
|
|
1068
1068
|
esphome/components/honeywellabp2_i2c/honeywellabp2.cpp,sha256=BNId9_2ey5W97Z8C7iyf8UynCczC4NvrmNy57eXVb8I,3435
|
1069
1069
|
esphome/components/honeywellabp2_i2c/honeywellabp2.h,sha256=oKx_nWi07fYioDxWPcNKtzDVKiyqBTvDIdREJoaHfMY,2140
|
1070
1070
|
esphome/components/honeywellabp2_i2c/sensor.py,sha256=RepjqSYlTrq-IgTMhB-y1oBkjAPdEm2uRiCH_zWDMeU,2574
|
1071
|
-
esphome/components/host/__init__.py,sha256=
|
1071
|
+
esphome/components/host/__init__.py,sha256=Lw6pfBikCNURCGlpd1eqGG9z28n2tsxjjXp_F18DWgw,1312
|
1072
1072
|
esphome/components/host/const.py,sha256=GvsG6HlxHm1Oh5rpiFTswpNIpG0xmfUvSHxtjZwmyuU,91
|
1073
1073
|
esphome/components/host/core.cpp,sha256=_CSOmrSgL-Zo707ff0xVsWnAFBRzjKWwE4EP-0LosZg,1766
|
1074
1074
|
esphome/components/host/gpio.cpp,sha256=OjPFXl9ZDLhsqUEuNvpAvZiiyeNuUyWjbi6DqZM2hFs,1582
|
@@ -1335,7 +1335,7 @@ esphome/components/light/base_light_effects.h,sha256=Gaf-zNUuH08r1dDCBo4sQVXUVx6
|
|
1335
1335
|
esphome/components/light/color_mode.h,sha256=oyGFoWEyQqQ7_dF5lrSAM8qVnKJTkwtNjlCXVKhS-5g,5193
|
1336
1336
|
esphome/components/light/effects.py,sha256=-seVxYLqdNvspTbTmK9t1f4PqcNVRccyjeStQA58N2Q,18286
|
1337
1337
|
esphome/components/light/esp_color_correction.cpp,sha256=-IKGJXJpixagMrhqU5nfM_H_HXG7MYWn0jPTVf8WKvI,748
|
1338
|
-
esphome/components/light/esp_color_correction.h,sha256=
|
1338
|
+
esphome/components/light/esp_color_correction.h,sha256=dfhhMSONCLKlY4zW8H7EJZqEsnDO2COLepGxNNbUw9U,3639
|
1339
1339
|
esphome/components/light/esp_color_view.h,sha256=eRWa7kOvhQ7XdQg2BPkFwQkaA8U96HIJMd_d42rkZAo,4103
|
1340
1340
|
esphome/components/light/esp_hsv_color.cpp,sha256=Wcxw1RaFCZxlNoxF1O7WDyMVx-yD5M67U2HiDGRxANU,1786
|
1341
1341
|
esphome/components/light/esp_hsv_color.h,sha256=hbeWvic6PIAn2vuBPKWtIN-estB_LvmTf62EyVg9p7Q,878
|
@@ -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=
|
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=
|
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=
|
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=
|
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=
|
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
|
@@ -1785,7 +1785,7 @@ esphome/components/neopixelbus/_methods.py,sha256=Qt6aC4K-9ySyRVD2aUy8UmM_H9brdf
|
|
1785
1785
|
esphome/components/neopixelbus/const.py,sha256=8dPnqN1skzSEnjjsr3H2Q3BJOEn-TyFB1PApCSSsYUw,824
|
1786
1786
|
esphome/components/neopixelbus/light.py,sha256=Qm2eq4wSt7jVcX81wtGvOmTHHIStP4GM1mNnHzrtUuQ,7289
|
1787
1787
|
esphome/components/neopixelbus/neopixelbus_light.h,sha256=Q-F19U58RBjGcE_0mJc7rZG5JPnxKNgcBWRVvbEH1V4,4650
|
1788
|
-
esphome/components/network/__init__.py,sha256=
|
1788
|
+
esphome/components/network/__init__.py,sha256=hCM31YwLZNy8HvJMZn2KvMFi_hIf9Y1JfnGlB20BsGM,1698
|
1789
1789
|
esphome/components/network/ip_address.h,sha256=Lo5e_hL1SVPnNxuRIApLQPxQ1HdQpyENknGU6NgSAm8,4291
|
1790
1790
|
esphome/components/network/util.cpp,sha256=OeOxJwdSrquCMNus24FbQ36BLd0nCywfIV49IVMYXJg,1509
|
1791
1791
|
esphome/components/network/util.h,sha256=nAgCt6G1XhB5LC2VQ3C_L6hy1IFdG7d1STktNdtWhqM,490
|
@@ -2131,7 +2131,7 @@ esphome/components/remote_base/panasonic_protocol.cpp,sha256=08JEhN4vcVv1FJ0it9q
|
|
2131
2131
|
esphome/components/remote_base/panasonic_protocol.h,sha256=YrtXNxZiPVFw3rtkQU4NKjC-niGAItqL3FE-FCVdSIE,1090
|
2132
2132
|
esphome/components/remote_base/pioneer_protocol.cpp,sha256=8X89lbk_aC2npTu8TaUIFAiDx47idcytdjkn4cTej4E,4131
|
2133
2133
|
esphome/components/remote_base/pioneer_protocol.h,sha256=qGaRii3aWsHDPV_0uobRJk4q872SM1ICz4no2Ix_Sxo,1034
|
2134
|
-
esphome/components/remote_base/pronto_protocol.cpp,sha256=
|
2134
|
+
esphome/components/remote_base/pronto_protocol.cpp,sha256=pfIsIv93NHc7tsl6uCoWjYSY8oFPxZ3Mj6ulcFNO_ZY,8197
|
2135
2135
|
esphome/components/remote_base/pronto_protocol.h,sha256=FO4Ph0bymIwxJEsZNAtrZgGcUsJGaxVOwpsrKa9YmMY,1619
|
2136
2136
|
esphome/components/remote_base/raw_protocol.cpp,sha256=UqPDj5BXVLJGUh_SC0XJPJivLbTbOI1bo0VjO5DtiVQ,1295
|
2137
2137
|
esphome/components/remote_base/raw_protocol.h,sha256=HN9cXJoPx747UcIZ9gnXgioI_E31DZjGQe0nbiQblpM,2198
|
@@ -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=
|
2215
|
-
esphome/components/rp2040_pio_led_strip/led_strip.h,sha256=
|
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,8 +2225,8 @@ 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=
|
2229
|
-
esphome/components/rtttl/rtttl.h,sha256
|
2228
|
+
esphome/components/rtttl/rtttl.cpp,sha256=dE5otTj-5gBhL15r0Mb8Qkxp-wvPdVTBL7pblLkWTYk,8320
|
2229
|
+
esphome/components/rtttl/rtttl.h,sha256=-qskl0bnrYQEd2hoVdT94d3PQdwEb6hoyiOpmFbk2oo,2757
|
2230
2230
|
esphome/components/ruuvi_ble/__init__.py,sha256=9LmcfStqBeEzcuWdON_iGuI6Xh0BUssV1Aebv98Krks,619
|
2231
2231
|
esphome/components/ruuvi_ble/ruuvi_ble.cpp,sha256=XXeYIgr1OB20MxtdcTDAWowFeK8qRQmQKTMeSEuhAec,5724
|
2232
2232
|
esphome/components/ruuvi_ble/ruuvi_ble.h,sha256=F5lb-4gHnOMArTrh0jTPUjRcScDFEX2V9JHwd_Q_-t4,997
|
@@ -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=
|
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=
|
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.
|
3229
|
-
esphome-2024.8.
|
3230
|
-
esphome-2024.8.
|
3231
|
-
esphome-2024.8.
|
3232
|
-
esphome-2024.8.
|
3233
|
-
esphome-2024.8.
|
3228
|
+
esphome-2024.8.0b1.dist-info/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
|
3229
|
+
esphome-2024.8.0b1.dist-info/METADATA,sha256=JgHERlBk-FV_Ihvmo4rpE5si5UedZ3Tg8wzck9hXNEg,3265
|
3230
|
+
esphome-2024.8.0b1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
3231
|
+
esphome-2024.8.0b1.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
|
3232
|
+
esphome-2024.8.0b1.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
|
3233
|
+
esphome-2024.8.0b1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|