esphome 2024.8.0b1__py3-none-any.whl → 2024.8.0b3__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/host/__init__.py +3 -7
- esphome/components/light/esp_color_correction.h +8 -8
- esphome/components/lvgl/defines.py +18 -14
- esphome/components/lvgl/lv_validation.py +55 -31
- esphome/components/lvgl/schemas.py +21 -11
- esphome/components/lvgl/widgets/__init__.py +21 -2
- esphome/components/microphone/microphone.h +4 -1
- esphome/components/network/__init__.py +5 -1
- esphome/components/remote_base/pronto_protocol.cpp +0 -3
- esphome/components/rtttl/rtttl.cpp +106 -21
- esphome/components/rtttl/rtttl.h +15 -6
- esphome/components/speaker/speaker.h +4 -0
- esphome/config_validation.py +14 -0
- esphome/const.py +1 -1
- {esphome-2024.8.0b1.dist-info → esphome-2024.8.0b3.dist-info}/METADATA +1 -1
- {esphome-2024.8.0b1.dist-info → esphome-2024.8.0b3.dist-info}/RECORD +21 -21
- {esphome-2024.8.0b1.dist-info → esphome-2024.8.0b3.dist-info}/LICENSE +0 -0
- {esphome-2024.8.0b1.dist-info → esphome-2024.8.0b3.dist-info}/WHEEL +0 -0
- {esphome-2024.8.0b1.dist-info → esphome-2024.8.0b3.dist-info}/entry_points.txt +0 -0
- {esphome-2024.8.0b1.dist-info → esphome-2024.8.0b3.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.6")
|
159
159
|
else:
|
160
160
|
cg.add_define("USE_API_PLAINTEXT")
|
161
161
|
|
@@ -1,15 +1,14 @@
|
|
1
|
+
import esphome.codegen as cg
|
2
|
+
import esphome.config_validation as cv
|
1
3
|
from esphome.const import (
|
4
|
+
CONF_MAC_ADDRESS,
|
2
5
|
KEY_CORE,
|
3
6
|
KEY_FRAMEWORK_VERSION,
|
4
7
|
KEY_TARGET_FRAMEWORK,
|
5
8
|
KEY_TARGET_PLATFORM,
|
6
9
|
PLATFORM_HOST,
|
7
|
-
CONF_MAC_ADDRESS,
|
8
10
|
)
|
9
11
|
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
|
13
12
|
|
14
13
|
from .const import KEY_HOST
|
15
14
|
|
@@ -42,8 +41,5 @@ async def to_code(config):
|
|
42
41
|
cg.add_build_flag("-DUSE_HOST")
|
43
42
|
cg.add_define("USE_ESPHOME_HOST_MAC_ADDRESS", config[CONF_MAC_ADDRESS].parts)
|
44
43
|
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")
|
48
44
|
cg.add_define("ESPHOME_BOARD", "host")
|
49
45
|
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 res;
|
44
|
+
uint16_t res = ((uncorrected / this->max_brightness_.red) * 255UL) / this->local_brightness_;
|
45
|
+
return (uint8_t) std::min(res, uint16_t(255));
|
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 res;
|
51
|
+
uint16_t res = ((uncorrected / this->max_brightness_.green) * 255UL) / this->local_brightness_;
|
52
|
+
return (uint8_t) std::min(res, uint16_t(255));
|
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 res;
|
58
|
+
uint16_t res = ((uncorrected / this->max_brightness_.blue) * 255UL) / this->local_brightness_;
|
59
|
+
return (uint8_t) std::min(res, uint16_t(255));
|
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 res;
|
65
|
+
uint16_t res = ((uncorrected / this->max_brightness_.white) * 255UL) / this->local_brightness_;
|
66
|
+
return (uint8_t) std::min(res, uint16_t(255));
|
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
|
10
|
-
from esphome.cpp_generator import MockObj
|
9
|
+
from esphome.core import Lambda
|
10
|
+
from esphome.cpp_generator import LambdaExpression, MockObj
|
11
11
|
from esphome.cpp_types import uint32
|
12
12
|
from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor
|
13
13
|
|
@@ -22,19 +22,22 @@ 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
|
+
|
25
32
|
class LValidator:
|
26
33
|
"""
|
27
34
|
A validator for a particular type used in LVGL. Usable in configs as a validator, also
|
28
35
|
has `process()` to convert a value during code generation
|
29
36
|
"""
|
30
37
|
|
31
|
-
def __init__(
|
32
|
-
self, validator, rtype, idtype=None, idexpr=None, retmapper=None, requires=None
|
33
|
-
):
|
38
|
+
def __init__(self, validator, rtype, retmapper=None, requires=None):
|
34
39
|
self.validator = validator
|
35
40
|
self.rtype = rtype
|
36
|
-
self.idtype = idtype
|
37
|
-
self.idexpr = idexpr
|
38
41
|
self.retmapper = retmapper
|
39
42
|
self.requires = requires
|
40
43
|
|
@@ -43,8 +46,6 @@ class LValidator:
|
|
43
46
|
value = requires_component(self.requires)(value)
|
44
47
|
if isinstance(value, cv.Lambda):
|
45
48
|
return cv.returning_lambda(value)
|
46
|
-
if self.idtype is not None and isinstance(value, ID):
|
47
|
-
return cv.use_id(self.idtype)(value)
|
48
49
|
return self.validator(value)
|
49
50
|
|
50
51
|
async def process(self, value, args=()):
|
@@ -52,10 +53,10 @@ class LValidator:
|
|
52
53
|
return None
|
53
54
|
if isinstance(value, Lambda):
|
54
55
|
return cg.RawExpression(
|
55
|
-
|
56
|
+
call_lambda(
|
57
|
+
await cg.process_lambda(value, args, return_type=self.rtype)
|
58
|
+
)
|
56
59
|
)
|
57
|
-
if self.idtype is not None and isinstance(value, ID):
|
58
|
-
return cg.RawExpression(f"{value}->{self.idexpr}")
|
59
60
|
if self.retmapper is not None:
|
60
61
|
return self.retmapper(value)
|
61
62
|
return cg.safe_exp(value)
|
@@ -89,7 +90,7 @@ class LvConstant(LValidator):
|
|
89
90
|
cv.ensure_list(self.one_of), uint32, retmapper=self.mapper
|
90
91
|
)
|
91
92
|
|
92
|
-
def mapper(self, value
|
93
|
+
def mapper(self, value):
|
93
94
|
if not isinstance(value, list):
|
94
95
|
value = [value]
|
95
96
|
return literal(
|
@@ -103,7 +104,7 @@ class LvConstant(LValidator):
|
|
103
104
|
|
104
105
|
def extend(self, *choices):
|
105
106
|
"""
|
106
|
-
Extend an
|
107
|
+
Extend an LVconstant with additional choices.
|
107
108
|
:param choices: The extra choices
|
108
109
|
:return: A new LVConstant instance
|
109
110
|
"""
|
@@ -431,6 +432,8 @@ CONF_ONE_LINE = "one_line"
|
|
431
432
|
CONF_ON_SELECT = "on_select"
|
432
433
|
CONF_ONE_CHECKED = "one_checked"
|
433
434
|
CONF_NEXT = "next"
|
435
|
+
CONF_PAD_ROW = "pad_row"
|
436
|
+
CONF_PAD_COLUMN = "pad_column"
|
434
437
|
CONF_PAGE = "page"
|
435
438
|
CONF_PAGE_WRAP = "page_wrap"
|
436
439
|
CONF_PASSWORD_MODE = "password_mode"
|
@@ -462,6 +465,7 @@ CONF_SKIP = "skip"
|
|
462
465
|
CONF_SYMBOL = "symbol"
|
463
466
|
CONF_TAB_ID = "tab_id"
|
464
467
|
CONF_TABS = "tabs"
|
468
|
+
CONF_TIME_FORMAT = "time_format"
|
465
469
|
CONF_TILE = "tile"
|
466
470
|
CONF_TILE_ID = "tile_id"
|
467
471
|
CONF_TILES = "tiles"
|
@@ -1,17 +1,14 @@
|
|
1
1
|
from typing import Union
|
2
2
|
|
3
3
|
import esphome.codegen as cg
|
4
|
-
from esphome.components.binary_sensor import BinarySensor
|
5
4
|
from esphome.components.color import ColorStruct
|
6
5
|
from esphome.components.font import Font
|
7
6
|
from esphome.components.image import Image_
|
8
|
-
from esphome.components.sensor import Sensor
|
9
|
-
from esphome.components.text_sensor import TextSensor
|
10
7
|
import esphome.config_validation as cv
|
11
|
-
from esphome.const import CONF_ARGS, CONF_COLOR, CONF_FORMAT, CONF_VALUE
|
12
|
-
from esphome.core import HexInt
|
8
|
+
from esphome.const import CONF_ARGS, CONF_COLOR, CONF_FORMAT, CONF_TIME, CONF_VALUE
|
9
|
+
from esphome.core import HexInt, Lambda
|
13
10
|
from esphome.cpp_generator import MockObj
|
14
|
-
from esphome.cpp_types import uint32
|
11
|
+
from esphome.cpp_types import ESPTime, uint32
|
15
12
|
from esphome.helpers import cpp_string_escape
|
16
13
|
from esphome.schema_extractors import SCHEMA_EXTRACT, schema_extractor
|
17
14
|
|
@@ -19,9 +16,11 @@ from . import types as ty
|
|
19
16
|
from .defines import (
|
20
17
|
CONF_END_VALUE,
|
21
18
|
CONF_START_VALUE,
|
19
|
+
CONF_TIME_FORMAT,
|
22
20
|
LV_FONTS,
|
23
21
|
LValidator,
|
24
22
|
LvConstant,
|
23
|
+
call_lambda,
|
25
24
|
literal,
|
26
25
|
)
|
27
26
|
from .helpers import (
|
@@ -110,13 +109,13 @@ def angle(value):
|
|
110
109
|
def size_validator(value):
|
111
110
|
"""A size in one axis - one of "size_content", a number (pixels) or a percentage"""
|
112
111
|
if value == SCHEMA_EXTRACT:
|
113
|
-
return ["
|
112
|
+
return ["SIZE_CONTENT", "number of pixels", "percentage"]
|
114
113
|
if isinstance(value, str) and value.lower().endswith("px"):
|
115
114
|
value = cv.int_(value[:-2])
|
116
115
|
if isinstance(value, str) and not value.endswith("%"):
|
117
116
|
if value.upper() == "SIZE_CONTENT":
|
118
117
|
return "LV_SIZE_CONTENT"
|
119
|
-
raise cv.Invalid("must be 'size_content', a
|
118
|
+
raise cv.Invalid("must be 'size_content', a percentage or an integer (pixels)")
|
120
119
|
if isinstance(value, int):
|
121
120
|
return cv.int_(value)
|
122
121
|
# Will throw an exception if not a percentage.
|
@@ -125,6 +124,15 @@ def size_validator(value):
|
|
125
124
|
|
126
125
|
size = LValidator(size_validator, uint32, retmapper=literal)
|
127
126
|
|
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
|
+
|
128
136
|
radius_consts = LvConstant("LV_RADIUS_", "CIRCLE")
|
129
137
|
|
130
138
|
|
@@ -167,9 +175,7 @@ lv_image = LValidator(
|
|
167
175
|
retmapper=lambda x: lv_expr.img_from(MockObj(x)),
|
168
176
|
requires="image",
|
169
177
|
)
|
170
|
-
lv_bool = LValidator(
|
171
|
-
cv.boolean, cg.bool_, BinarySensor, "get_state()", retmapper=literal
|
172
|
-
)
|
178
|
+
lv_bool = LValidator(cv.boolean, cg.bool_, retmapper=literal)
|
173
179
|
|
174
180
|
|
175
181
|
def lv_pct(value: Union[int, float]):
|
@@ -185,42 +191,60 @@ def lvms_validator_(value):
|
|
185
191
|
|
186
192
|
|
187
193
|
lv_milliseconds = LValidator(
|
188
|
-
lvms_validator_,
|
189
|
-
cg.int32,
|
190
|
-
retmapper=lambda x: x.total_milliseconds,
|
194
|
+
lvms_validator_, cg.int32, retmapper=lambda x: x.total_milliseconds
|
191
195
|
)
|
192
196
|
|
193
197
|
|
194
198
|
class TextValidator(LValidator):
|
195
199
|
def __init__(self):
|
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
|
-
)
|
200
|
+
super().__init__(cv.string, cg.std_string, lambda s: cg.safe_exp(f"{s}"))
|
203
201
|
|
204
202
|
def __call__(self, value):
|
205
|
-
if isinstance(value, dict):
|
203
|
+
if isinstance(value, dict) and CONF_FORMAT in value:
|
206
204
|
return value
|
207
205
|
return super().__call__(value)
|
208
206
|
|
209
207
|
async def process(self, value, args=()):
|
210
208
|
if isinstance(value, dict):
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
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)
|
215
241
|
return await super().process(value, args)
|
216
242
|
|
217
243
|
|
218
244
|
lv_text = TextValidator()
|
219
|
-
lv_float = LValidator(cv.float_, cg.float_
|
220
|
-
lv_int = LValidator(cv.int_, cg.int_
|
221
|
-
lv_brightness = LValidator(
|
222
|
-
cv.percentage, cg.float_, Sensor, "get_state()", retmapper=lambda x: int(x * 255)
|
223
|
-
)
|
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))
|
224
248
|
|
225
249
|
|
226
250
|
def is_lv_font(font):
|
@@ -1,5 +1,6 @@
|
|
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
|
3
4
|
from esphome.const import (
|
4
5
|
CONF_ARGS,
|
5
6
|
CONF_FORMAT,
|
@@ -8,6 +9,7 @@ from esphome.const import (
|
|
8
9
|
CONF_ON_VALUE,
|
9
10
|
CONF_STATE,
|
10
11
|
CONF_TEXT,
|
12
|
+
CONF_TIME,
|
11
13
|
CONF_TRIGGER_ID,
|
12
14
|
CONF_TYPE,
|
13
15
|
)
|
@@ -15,6 +17,7 @@ from esphome.core import TimePeriod
|
|
15
17
|
from esphome.schema_extractors import SCHEMA_EXTRACT
|
16
18
|
|
17
19
|
from . import defines as df, lv_validation as lvalid
|
20
|
+
from .defines import CONF_TIME_FORMAT
|
18
21
|
from .helpers import add_lv_use, requires_component, validate_printf
|
19
22
|
from .lv_validation import lv_color, lv_font, lv_image
|
20
23
|
from .lvcode import LvglComponent
|
@@ -46,7 +49,13 @@ TEXT_SCHEMA = cv.Schema(
|
|
46
49
|
),
|
47
50
|
validate_printf,
|
48
51
|
),
|
49
|
-
|
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),
|
50
59
|
)
|
51
60
|
}
|
52
61
|
)
|
@@ -116,15 +125,13 @@ STYLE_PROPS = {
|
|
116
125
|
"opa_layered": lvalid.opacity,
|
117
126
|
"outline_color": lvalid.lv_color,
|
118
127
|
"outline_opa": lvalid.opacity,
|
119
|
-
"outline_pad": lvalid.
|
120
|
-
"outline_width": lvalid.
|
121
|
-
"pad_all": lvalid.
|
122
|
-
"pad_bottom": lvalid.
|
123
|
-
"
|
124
|
-
"
|
125
|
-
"
|
126
|
-
"pad_row": lvalid.size,
|
127
|
-
"pad_top": lvalid.size,
|
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,
|
128
135
|
"shadow_color": lvalid.lv_color,
|
129
136
|
"shadow_ofs_x": cv.int_,
|
130
137
|
"shadow_ofs_y": cv.int_,
|
@@ -304,6 +311,8 @@ LAYOUT_SCHEMA = {
|
|
304
311
|
cv.Required(df.CONF_GRID_COLUMNS): [grid_spec],
|
305
312
|
cv.Optional(df.CONF_GRID_COLUMN_ALIGN): grid_alignments,
|
306
313
|
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,
|
307
316
|
},
|
308
317
|
df.TYPE_FLEX: {
|
309
318
|
cv.Optional(
|
@@ -312,6 +321,8 @@ LAYOUT_SCHEMA = {
|
|
312
321
|
cv.Optional(df.CONF_FLEX_ALIGN_MAIN, default="start"): flex_alignments,
|
313
322
|
cv.Optional(df.CONF_FLEX_ALIGN_CROSS, default="start"): flex_alignments,
|
314
323
|
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,
|
315
326
|
},
|
316
327
|
},
|
317
328
|
lower=True,
|
@@ -338,7 +349,6 @@ DISP_BG_SCHEMA = cv.Schema(
|
|
338
349
|
}
|
339
350
|
)
|
340
351
|
|
341
|
-
|
342
352
|
# A style schema that can include text
|
343
353
|
STYLED_TEXT_SCHEMA = cv.maybe_simple_value(
|
344
354
|
STYLE_SCHEMA.extend(TEXT_SCHEMA), key=CONF_TEXT
|
@@ -20,6 +20,8 @@ from ..defines import (
|
|
20
20
|
CONF_GRID_ROWS,
|
21
21
|
CONF_LAYOUT,
|
22
22
|
CONF_MAIN,
|
23
|
+
CONF_PAD_COLUMN,
|
24
|
+
CONF_PAD_ROW,
|
23
25
|
CONF_SCROLLBAR_MODE,
|
24
26
|
CONF_STYLES,
|
25
27
|
CONF_WIDGETS,
|
@@ -29,6 +31,7 @@ from ..defines import (
|
|
29
31
|
TYPE_FLEX,
|
30
32
|
TYPE_GRID,
|
31
33
|
LValidator,
|
34
|
+
call_lambda,
|
32
35
|
join_enums,
|
33
36
|
literal,
|
34
37
|
)
|
@@ -273,6 +276,10 @@ async def set_obj_properties(w: Widget, config):
|
|
273
276
|
layout_type: str = layout[CONF_TYPE]
|
274
277
|
add_lv_use(layout_type)
|
275
278
|
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)
|
276
283
|
if layout_type == TYPE_GRID:
|
277
284
|
wid = config[CONF_ID]
|
278
285
|
rows = [str(x) for x in layout[CONF_GRID_ROWS]]
|
@@ -316,8 +323,13 @@ async def set_obj_properties(w: Widget, config):
|
|
316
323
|
flag_clr = set()
|
317
324
|
flag_set = set()
|
318
325
|
props = parts[CONF_MAIN][CONF_DEFAULT]
|
326
|
+
lambs = {}
|
327
|
+
flag_set = set()
|
328
|
+
flag_clr = set()
|
319
329
|
for prop, value in {k: v for k, v in props.items() if k in OBJ_FLAGS}.items():
|
320
|
-
if value:
|
330
|
+
if isinstance(value, cv.Lambda):
|
331
|
+
lambs[prop] = value
|
332
|
+
elif value:
|
321
333
|
flag_set.add(prop)
|
322
334
|
else:
|
323
335
|
flag_clr.add(prop)
|
@@ -327,6 +339,13 @@ async def set_obj_properties(w: Widget, config):
|
|
327
339
|
if flag_clr:
|
328
340
|
clrs = join_enums(flag_clr, "LV_OBJ_FLAG_")
|
329
341
|
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)
|
330
349
|
|
331
350
|
if states := config.get(CONF_STATE):
|
332
351
|
adds = set()
|
@@ -348,7 +367,7 @@ async def set_obj_properties(w: Widget, config):
|
|
348
367
|
for key, value in lambs.items():
|
349
368
|
lamb = await cg.process_lambda(value, [], return_type=cg.bool_)
|
350
369
|
state = f"LV_STATE_{key.upper()}"
|
351
|
-
with LvConditional(
|
370
|
+
with LvConditional(call_lambda(lamb)) as cond:
|
352
371
|
w.add_state(state)
|
353
372
|
cond.else_()
|
354
373
|
w.clear_state(state)
|
@@ -24,7 +24,11 @@ CONFIG_SCHEMA = cv.Schema(
|
|
24
24
|
esp32=False,
|
25
25
|
rp2040=False,
|
26
26
|
): cv.All(
|
27
|
-
cv.boolean,
|
27
|
+
cv.boolean,
|
28
|
+
cv.Any(
|
29
|
+
cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266, PLATFORM_RP2040]),
|
30
|
+
cv.boolean_false,
|
31
|
+
),
|
28
32
|
),
|
29
33
|
cv.Optional(CONF_MIN_IPV6_ADDR_COUNT, default=0): cv.positive_int,
|
30
34
|
}
|
@@ -201,9 +201,6 @@ 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
|
-
|
207
204
|
return out;
|
208
205
|
}
|
209
206
|
|
@@ -29,6 +29,13 @@ 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, "RTTL Component is already playing: %s", name.c_str());
|
36
|
+
return;
|
37
|
+
}
|
38
|
+
|
32
39
|
this->rtttl_ = std::move(rtttl);
|
33
40
|
|
34
41
|
this->default_duration_ = 4;
|
@@ -98,13 +105,20 @@ void Rtttl::play(std::string rtttl) {
|
|
98
105
|
this->note_duration_ = 1;
|
99
106
|
|
100
107
|
#ifdef USE_SPEAKER
|
101
|
-
this->
|
102
|
-
|
108
|
+
if (this->speaker_ != nullptr) {
|
109
|
+
this->set_state_(State::STATE_INIT);
|
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
|
+
}
|
103
118
|
#endif
|
104
119
|
}
|
105
120
|
|
106
121
|
void Rtttl::stop() {
|
107
|
-
this->note_duration_ = 0;
|
108
122
|
#ifdef USE_OUTPUT
|
109
123
|
if (this->output_ != nullptr) {
|
110
124
|
this->output_->set_level(0.0);
|
@@ -117,16 +131,35 @@ void Rtttl::stop() {
|
|
117
131
|
}
|
118
132
|
}
|
119
133
|
#endif
|
134
|
+
this->note_duration_ = 0;
|
135
|
+
this->set_state_(STATE_STOPPING);
|
120
136
|
}
|
121
137
|
|
122
138
|
void Rtttl::loop() {
|
123
|
-
if (this->note_duration_ == 0)
|
139
|
+
if (this->note_duration_ == 0 || this->state_ == State::STATE_STOPPED)
|
124
140
|
return;
|
125
141
|
|
126
142
|
#ifdef USE_SPEAKER
|
127
143
|
if (this->speaker_ != nullptr) {
|
144
|
+
if (this->state_ == State::STATE_STOPPING) {
|
145
|
+
if (this->speaker_->is_stopped()) {
|
146
|
+
this->set_state_(State::STATE_STOPPED);
|
147
|
+
}
|
148
|
+
} else if (this->state_ == State::STATE_INIT) {
|
149
|
+
if (this->speaker_->is_stopped()) {
|
150
|
+
this->speaker_->start();
|
151
|
+
this->set_state_(State::STATE_STARTING);
|
152
|
+
}
|
153
|
+
} else if (this->state_ == State::STATE_STARTING) {
|
154
|
+
if (this->speaker_->is_running()) {
|
155
|
+
this->set_state_(State::STATE_RUNNING);
|
156
|
+
}
|
157
|
+
}
|
158
|
+
if (!this->speaker_->is_running()) {
|
159
|
+
return;
|
160
|
+
}
|
128
161
|
if (this->samples_sent_ != this->samples_count_) {
|
129
|
-
SpeakerSample sample[SAMPLE_BUFFER_SIZE +
|
162
|
+
SpeakerSample sample[SAMPLE_BUFFER_SIZE + 2];
|
130
163
|
int x = 0;
|
131
164
|
double rem = 0.0;
|
132
165
|
|
@@ -136,7 +169,7 @@ void Rtttl::loop() {
|
|
136
169
|
if (this->samples_per_wave_ != 0 && this->samples_sent_ >= this->samples_gap_) { // Play note//
|
137
170
|
rem = ((this->samples_sent_ << 10) % this->samples_per_wave_) * (360.0 / this->samples_per_wave_);
|
138
171
|
|
139
|
-
int16_t val = (
|
172
|
+
int16_t val = (127 * this->gain_) * sin(deg2rad(rem)); // 16bit = 49152
|
140
173
|
|
141
174
|
sample[x].left = val;
|
142
175
|
sample[x].right = val;
|
@@ -153,9 +186,9 @@ void Rtttl::loop() {
|
|
153
186
|
x++;
|
154
187
|
}
|
155
188
|
if (x > 0) {
|
156
|
-
int send = this->speaker_->play((uint8_t *) (&sample), x *
|
189
|
+
int send = this->speaker_->play((uint8_t *) (&sample), x * 2);
|
157
190
|
if (send != x * 4) {
|
158
|
-
this->samples_sent_ -= (x - (send /
|
191
|
+
this->samples_sent_ -= (x - (send / 2));
|
159
192
|
}
|
160
193
|
return;
|
161
194
|
}
|
@@ -167,14 +200,7 @@ void Rtttl::loop() {
|
|
167
200
|
return;
|
168
201
|
#endif
|
169
202
|
if (!this->rtttl_[position_]) {
|
170
|
-
this->
|
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();
|
203
|
+
this->finish_();
|
178
204
|
return;
|
179
205
|
}
|
180
206
|
|
@@ -213,6 +239,7 @@ void Rtttl::loop() {
|
|
213
239
|
case 'a':
|
214
240
|
note = 10;
|
215
241
|
break;
|
242
|
+
case 'h':
|
216
243
|
case 'b':
|
217
244
|
note = 12;
|
218
245
|
break;
|
@@ -238,14 +265,21 @@ void Rtttl::loop() {
|
|
238
265
|
uint8_t scale = get_integer_();
|
239
266
|
if (scale == 0)
|
240
267
|
scale = this->default_octave_;
|
268
|
+
|
269
|
+
if (scale < 4 || scale > 7) {
|
270
|
+
ESP_LOGE(TAG, "Octave out of valid range. Should be between 4 and 7. (Octave: %d)", scale);
|
271
|
+
this->finish_();
|
272
|
+
return;
|
273
|
+
}
|
241
274
|
bool need_note_gap = false;
|
242
275
|
|
243
276
|
// Now play the note
|
244
277
|
if (note) {
|
245
278
|
auto note_index = (scale - 4) * 12 + note;
|
246
279
|
if (note_index < 0 || note_index >= (int) sizeof(NOTES)) {
|
247
|
-
ESP_LOGE(TAG, "Note out of valid range"
|
248
|
-
|
280
|
+
ESP_LOGE(TAG, "Note out of valid range (note: %d, scale: %d, index: %d, max: %d)", note, scale, note_index,
|
281
|
+
(int) sizeof(NOTES));
|
282
|
+
this->finish_();
|
249
283
|
return;
|
250
284
|
}
|
251
285
|
auto freq = NOTES[note_index];
|
@@ -285,14 +319,17 @@ void Rtttl::loop() {
|
|
285
319
|
this->samples_gap_ = (this->sample_rate_ * DOUBLE_NOTE_GAP_MS) / 1600; //(ms);
|
286
320
|
}
|
287
321
|
if (this->output_freq_ != 0) {
|
322
|
+
// make sure there is enough samples to add a full last sinus.
|
323
|
+
|
324
|
+
uint16_t samples_wish = this->samples_count_;
|
288
325
|
this->samples_per_wave_ = (this->sample_rate_ << 10) / this->output_freq_;
|
289
326
|
|
290
|
-
// make sure there is enough samples to add a full last sinus.
|
291
327
|
uint16_t division = ((this->samples_count_ << 10) / this->samples_per_wave_) + 1;
|
292
|
-
|
328
|
+
|
293
329
|
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_);
|
295
330
|
this->samples_count_ = this->samples_count_ >> 10;
|
331
|
+
ESP_LOGVV(TAG, "- Calc play time: wish: %d gets: %d (div: %d spw: %d)", samples_wish, this->samples_count_,
|
332
|
+
division, this->samples_per_wave_);
|
296
333
|
}
|
297
334
|
// Convert from frequency in Hz to high and low samples in fixed point
|
298
335
|
}
|
@@ -301,5 +338,53 @@ void Rtttl::loop() {
|
|
301
338
|
this->last_note_ = millis();
|
302
339
|
}
|
303
340
|
|
341
|
+
void Rtttl::finish_() {
|
342
|
+
#ifdef USE_OUTPUT
|
343
|
+
if (this->output_ != nullptr) {
|
344
|
+
this->output_->set_level(0.0);
|
345
|
+
}
|
346
|
+
#endif
|
347
|
+
#ifdef USE_SPEAKER
|
348
|
+
if (this->speaker_ != nullptr) {
|
349
|
+
SpeakerSample sample[2];
|
350
|
+
sample[0].left = 0;
|
351
|
+
sample[0].right = 0;
|
352
|
+
sample[1].left = 0;
|
353
|
+
sample[1].right = 0;
|
354
|
+
this->speaker_->play((uint8_t *) (&sample), 8);
|
355
|
+
|
356
|
+
this->speaker_->finish();
|
357
|
+
}
|
358
|
+
#endif
|
359
|
+
this->set_state_(State::STATE_STOPPING);
|
360
|
+
this->note_duration_ = 0;
|
361
|
+
this->on_finished_playback_callback_.call();
|
362
|
+
ESP_LOGD(TAG, "Playback finished");
|
363
|
+
}
|
364
|
+
|
365
|
+
static const LogString *state_to_string(State state) {
|
366
|
+
switch (state) {
|
367
|
+
case STATE_STOPPED:
|
368
|
+
return LOG_STR("STATE_STOPPED");
|
369
|
+
case STATE_STARTING:
|
370
|
+
return LOG_STR("STATE_STARTING");
|
371
|
+
case STATE_RUNNING:
|
372
|
+
return LOG_STR("STATE_RUNNING");
|
373
|
+
case STATE_STOPPING:
|
374
|
+
return LOG_STR("STATE_STOPPING");
|
375
|
+
case STATE_INIT:
|
376
|
+
return LOG_STR("STATE_INIT");
|
377
|
+
default:
|
378
|
+
return LOG_STR("UNKNOWN");
|
379
|
+
}
|
380
|
+
};
|
381
|
+
|
382
|
+
void Rtttl::set_state_(State state) {
|
383
|
+
State old_state = this->state_;
|
384
|
+
this->state_ = state;
|
385
|
+
ESP_LOGD(TAG, "State changed from %s to %s", LOG_STR_ARG(state_to_string(old_state)),
|
386
|
+
LOG_STR_ARG(state_to_string(state)));
|
387
|
+
}
|
388
|
+
|
304
389
|
} // namespace rtttl
|
305
390
|
} // namespace esphome
|
esphome/components/rtttl/rtttl.h
CHANGED
@@ -14,12 +14,20 @@
|
|
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
|
+
|
17
25
|
#ifdef USE_SPEAKER
|
18
|
-
static const size_t SAMPLE_BUFFER_SIZE =
|
26
|
+
static const size_t SAMPLE_BUFFER_SIZE = 2048;
|
19
27
|
|
20
28
|
struct SpeakerSample {
|
21
|
-
|
22
|
-
|
29
|
+
int8_t left{0};
|
30
|
+
int8_t right{0};
|
23
31
|
};
|
24
32
|
#endif
|
25
33
|
|
@@ -42,7 +50,7 @@ class Rtttl : public Component {
|
|
42
50
|
void stop();
|
43
51
|
void dump_config() override;
|
44
52
|
|
45
|
-
bool is_playing() { return this->
|
53
|
+
bool is_playing() { return this->state_ != State::STATE_STOPPED; }
|
46
54
|
void loop() override;
|
47
55
|
|
48
56
|
void add_on_finished_playback_callback(std::function<void()> callback) {
|
@@ -57,6 +65,8 @@ class Rtttl : public Component {
|
|
57
65
|
}
|
58
66
|
return ret;
|
59
67
|
}
|
68
|
+
void finish_();
|
69
|
+
void set_state_(State state);
|
60
70
|
|
61
71
|
std::string rtttl_{""};
|
62
72
|
size_t position_{0};
|
@@ -68,13 +78,12 @@ class Rtttl : public Component {
|
|
68
78
|
|
69
79
|
uint32_t output_freq_;
|
70
80
|
float gain_{0.6f};
|
81
|
+
State state_{State::STATE_STOPPED};
|
71
82
|
|
72
83
|
#ifdef USE_OUTPUT
|
73
84
|
output::FloatOutput *output_;
|
74
85
|
#endif
|
75
86
|
|
76
|
-
void play_output_();
|
77
|
-
|
78
87
|
#ifdef USE_SPEAKER
|
79
88
|
speaker::Speaker *speaker_{nullptr};
|
80
89
|
int sample_rate_{16000};
|
esphome/config_validation.py
CHANGED
@@ -370,6 +370,20 @@ 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
|
+
|
373
387
|
@schema_extractor_list
|
374
388
|
def ensure_list(*validators):
|
375
389
|
"""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=Uck0GvA97sJ6sW25y0nqvOT2nsYIb6uZ_1sI-YBl4vc,65844
|
8
|
+
esphome/const.py,sha256=gW_Ylnoo9hnOGQZRCz_BaYDmMBkA6n__s7u02jKqmE4,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=grnorxG9QG00eQwcIsiijno_o_JS6xKzOitqLS1DkXg,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
|
@@ -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=LKE6IICarnNbEpE22ej3HVy6VDeXS3rJ72tA2Bds3VI,1175
|
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=xSGLomrn8_T5zQIrYwCiDPFh4D7cV1ZkwQK1_IbgmmI,3783
|
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=DxFTnt42o9eLRExvIUqzkmcVN-4nMBF6YSewxynfo_s,12183
|
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=aGWc0YBZCZjYIgwYwE83vnROFiaMJf6Fo9db1Sas6Jc,8995
|
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=CmENCi8w-gO7bvJB0mw5LAhk_dxSNchjOvqwUu7v4TE,14045
|
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=N2fLNSexPZuJkqPIKR_4IXJXMxJlAWHcmoV7L5S2qlA,13065
|
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=j_ILMqRG29PXcr5Q5IxdBAghRvuajix2eXkUhIwahNs,874
|
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=IUrCGnUyg2U2R-AWFQp63VpB5PQgpKv1LGA5tFqBZ7E,1784
|
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=yYNsT4EZJQyAFavqu4IXoGo16hPH6s_1ITtOBweJGTg,8111
|
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
|
@@ -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=RbVz9upUhTCqoPMnQjLUDmDzuEBlA6yWKQ2Ml_aTxts,10779
|
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
|
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=cLRt67zz0KOSuPSdpJOOioQIHWu6bUneZQSiyj4WuM4,1018
|
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
|
@@ -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.0b3.dist-info/LICENSE,sha256=HzEjkBInJe44L4WvAOPfhPJJDNj6YbnqFyvGWRzArGM,36664
|
3229
|
+
esphome-2024.8.0b3.dist-info/METADATA,sha256=9BUeGDF4rU-BwxY-hpEJKgOrtSmV_N5jsGqTc8BsRdw,3265
|
3230
|
+
esphome-2024.8.0b3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
3231
|
+
esphome-2024.8.0b3.dist-info/entry_points.txt,sha256=mIxVNuWtbYzeEcaWCl-AQ-97aBOWbnYBAK8nbF6P4M0,50
|
3232
|
+
esphome-2024.8.0b3.dist-info/top_level.txt,sha256=0GSXEW3cnITpgG3qnsSMz0qoqJHAFyfw7Y8MVtEf1Yk,8
|
3233
|
+
esphome-2024.8.0b3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|