mirror of
https://github.com/esphome/esphome.git
synced 2025-11-07 10:31:49 +00:00
Compare commits
104 Commits
2023.3.0b2
...
2023.3.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e6737479f7 | ||
|
|
7f75832bf1 | ||
|
|
33339e3bd8 | ||
|
|
c298c1166f | ||
|
|
c3d9eef01f | ||
|
|
5ffdc66864 | ||
|
|
9922c1503a | ||
|
|
fce99d4b17 | ||
|
|
11567085d8 | ||
|
|
83f8e84247 | ||
|
|
11eb5cb0fa | ||
|
|
9a7af97b2d | ||
|
|
5e11469f50 | ||
|
|
0c7a3d1fff | ||
|
|
8a705bf4b0 | ||
|
|
6a89180deb | ||
|
|
65d2b806cc | ||
|
|
c149a3033c | ||
|
|
4b7c233f1a | ||
|
|
6e8e9c2aa9 | ||
|
|
b6f628ee40 | ||
|
|
bf79a700b7 | ||
|
|
cdeb6e750f | ||
|
|
c037e95861 | ||
|
|
2e1b35959f | ||
|
|
7f46d9e0f9 | ||
|
|
069b5f81a0 | ||
|
|
3a36d0b13f | ||
|
|
f0760e99b7 | ||
|
|
18fecf8c09 | ||
|
|
414cf1b333 | ||
|
|
d10f891f51 | ||
|
|
b5927322e6 | ||
|
|
1cf4107e1c | ||
|
|
c12408326c | ||
|
|
4434e59e5a | ||
|
|
45180d98f6 | ||
|
|
44494ad18e | ||
|
|
1447536906 | ||
|
|
27ec517084 | ||
|
|
ce1f034bac | ||
|
|
f1f96f16e9 | ||
|
|
4af4649e23 | ||
|
|
8bcddef39d | ||
|
|
4ac96ccea2 | ||
|
|
3c5de77ae9 | ||
|
|
a2925b1d37 | ||
|
|
73748e9e20 | ||
|
|
75c9823899 | ||
|
|
c8c0bd3351 | ||
|
|
e1cdeb7c8f | ||
|
|
7f97f42552 | ||
|
|
aa7f3569ec | ||
|
|
2d0a08442e | ||
|
|
d2380756b2 | ||
|
|
925e3cb6c9 | ||
|
|
6757acba56 | ||
|
|
5cc91cdd95 | ||
|
|
2b41886819 | ||
|
|
72c6efd6a0 | ||
|
|
a1f1804112 | ||
|
|
a8b1ceb4e9 | ||
|
|
4fb0f7f8c6 | ||
|
|
958cadeca8 | ||
|
|
00f2655f1a | ||
|
|
074f5029eb | ||
|
|
1691976587 | ||
|
|
60e6b4d21e | ||
|
|
5750591df2 | ||
|
|
a75da54455 | ||
|
|
de7f6c3f5f | ||
|
|
4245480656 | ||
|
|
1824c8131e | ||
|
|
4e9606d2e0 | ||
|
|
78500fa933 | ||
|
|
9c69b98a49 | ||
|
|
e6d8ef98d3 | ||
|
|
3f1af1690b | ||
|
|
84374b6b1e | ||
|
|
391316c9b5 | ||
|
|
705c62ebd7 | ||
|
|
7209dd8bae | ||
|
|
ab736c89bb | ||
|
|
6911639617 | ||
|
|
b9720d0715 | ||
|
|
47b3267ed4 | ||
|
|
e16ba2adb5 | ||
|
|
0a19b1e32c | ||
|
|
bae9a950c0 | ||
|
|
72b2943332 | ||
|
|
4ec0ef7548 | ||
|
|
25bc6761f6 | ||
|
|
81b6562c25 | ||
|
|
ae74189fc2 | ||
|
|
9e516efe10 | ||
|
|
366e29439e | ||
|
|
1c9c700d7f | ||
|
|
b2e6b9d31f | ||
|
|
7623f63846 | ||
|
|
2bfaf9dce3 | ||
|
|
5c2c1560bb | ||
|
|
f7096ab78e | ||
|
|
98f8feb625 | ||
|
|
9944ca414e |
@@ -10,23 +10,42 @@ CONF_RED_INT = "red_int"
|
|||||||
CONF_GREEN_INT = "green_int"
|
CONF_GREEN_INT = "green_int"
|
||||||
CONF_BLUE_INT = "blue_int"
|
CONF_BLUE_INT = "blue_int"
|
||||||
CONF_WHITE_INT = "white_int"
|
CONF_WHITE_INT = "white_int"
|
||||||
|
CONF_HEX = "hex"
|
||||||
CONFIG_SCHEMA = cv.Schema(
|
|
||||||
{
|
|
||||||
cv.Required(CONF_ID): cv.declare_id(ColorStruct),
|
|
||||||
cv.Exclusive(CONF_RED, "red"): cv.percentage,
|
|
||||||
cv.Exclusive(CONF_RED_INT, "red"): cv.uint8_t,
|
|
||||||
cv.Exclusive(CONF_GREEN, "green"): cv.percentage,
|
|
||||||
cv.Exclusive(CONF_GREEN_INT, "green"): cv.uint8_t,
|
|
||||||
cv.Exclusive(CONF_BLUE, "blue"): cv.percentage,
|
|
||||||
cv.Exclusive(CONF_BLUE_INT, "blue"): cv.uint8_t,
|
|
||||||
cv.Exclusive(CONF_WHITE, "white"): cv.percentage,
|
|
||||||
cv.Exclusive(CONF_WHITE_INT, "white"): cv.uint8_t,
|
|
||||||
}
|
|
||||||
).extend(cv.COMPONENT_SCHEMA)
|
|
||||||
|
|
||||||
|
|
||||||
async def to_code(config):
|
def hex_color(value):
|
||||||
|
if len(value) != 6:
|
||||||
|
raise cv.Invalid("Color must have six digits")
|
||||||
|
try:
|
||||||
|
return (int(value[0:2], 16), int(value[2:4], 16), int(value[4:6], 16))
|
||||||
|
except ValueError as exc:
|
||||||
|
raise cv.Invalid("Color must be hexadecimal") from exc
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_SCHEMA = cv.Any(
|
||||||
|
cv.Schema(
|
||||||
|
{
|
||||||
|
cv.Required(CONF_ID): cv.declare_id(ColorStruct),
|
||||||
|
cv.Exclusive(CONF_RED, "red"): cv.percentage,
|
||||||
|
cv.Exclusive(CONF_RED_INT, "red"): cv.uint8_t,
|
||||||
|
cv.Exclusive(CONF_GREEN, "green"): cv.percentage,
|
||||||
|
cv.Exclusive(CONF_GREEN_INT, "green"): cv.uint8_t,
|
||||||
|
cv.Exclusive(CONF_BLUE, "blue"): cv.percentage,
|
||||||
|
cv.Exclusive(CONF_BLUE_INT, "blue"): cv.uint8_t,
|
||||||
|
cv.Exclusive(CONF_WHITE, "white"): cv.percentage,
|
||||||
|
cv.Exclusive(CONF_WHITE_INT, "white"): cv.uint8_t,
|
||||||
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA),
|
||||||
|
cv.Schema(
|
||||||
|
{
|
||||||
|
cv.Required(CONF_ID): cv.declare_id(ColorStruct),
|
||||||
|
cv.Required(CONF_HEX): hex_color,
|
||||||
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def from_rgbw(config):
|
||||||
r = 0
|
r = 0
|
||||||
if CONF_RED in config:
|
if CONF_RED in config:
|
||||||
r = int(config[CONF_RED] * 255)
|
r = int(config[CONF_RED] * 255)
|
||||||
@@ -51,6 +70,16 @@ async def to_code(config):
|
|||||||
elif CONF_WHITE_INT in config:
|
elif CONF_WHITE_INT in config:
|
||||||
w = config[CONF_WHITE_INT]
|
w = config[CONF_WHITE_INT]
|
||||||
|
|
||||||
|
return (r, g, b, w)
|
||||||
|
|
||||||
|
|
||||||
|
async def to_code(config):
|
||||||
|
if CONF_HEX in config:
|
||||||
|
r, g, b = config[CONF_HEX]
|
||||||
|
w = 0
|
||||||
|
else:
|
||||||
|
r, g, b, w = from_rgbw(config)
|
||||||
|
|
||||||
cg.new_variable(
|
cg.new_variable(
|
||||||
config[CONF_ID],
|
config[CONF_ID],
|
||||||
cg.StructInitializer(ColorStruct, ("r", r), ("g", g), ("b", b), ("w", w)),
|
cg.StructInitializer(ColorStruct, ("r", r), ("g", g), ("b", b), ("w", w)),
|
||||||
|
|||||||
@@ -32,9 +32,11 @@ void Rect::extend(Rect rect) {
|
|||||||
this->h = rect.h;
|
this->h = rect.h;
|
||||||
} else {
|
} else {
|
||||||
if (this->x > rect.x) {
|
if (this->x > rect.x) {
|
||||||
|
this->w = this->w + (this->x - rect.x);
|
||||||
this->x = rect.x;
|
this->x = rect.x;
|
||||||
}
|
}
|
||||||
if (this->y > rect.y) {
|
if (this->y > rect.y) {
|
||||||
|
this->h = this->h + (this->y - rect.y);
|
||||||
this->y = rect.y;
|
this->y = rect.y;
|
||||||
}
|
}
|
||||||
if (this->x2() < rect.x2()) {
|
if (this->x2() < rect.x2()) {
|
||||||
@@ -49,29 +51,35 @@ void Rect::shrink(Rect rect) {
|
|||||||
if (!this->inside(rect)) {
|
if (!this->inside(rect)) {
|
||||||
(*this) = Rect();
|
(*this) = Rect();
|
||||||
} else {
|
} else {
|
||||||
if (this->x < rect.x) {
|
|
||||||
this->x = rect.x;
|
|
||||||
}
|
|
||||||
if (this->y < rect.y) {
|
|
||||||
this->y = rect.y;
|
|
||||||
}
|
|
||||||
if (this->x2() > rect.x2()) {
|
if (this->x2() > rect.x2()) {
|
||||||
this->w = rect.x2() - this->x;
|
this->w = rect.x2() - this->x;
|
||||||
}
|
}
|
||||||
|
if (this->x < rect.x) {
|
||||||
|
this->w = this->w + (this->x - rect.x);
|
||||||
|
this->x = rect.x;
|
||||||
|
}
|
||||||
if (this->y2() > rect.y2()) {
|
if (this->y2() > rect.y2()) {
|
||||||
this->h = rect.y2() - this->y;
|
this->h = rect.y2() - this->y;
|
||||||
}
|
}
|
||||||
|
if (this->y < rect.y) {
|
||||||
|
this->h = this->h + (this->y - rect.y);
|
||||||
|
this->y = rect.y;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Rect::inside(int16_t x, int16_t y, bool absolute) { // NOLINT
|
bool Rect::equal(Rect rect) {
|
||||||
|
return (rect.x == this->x) && (rect.w == this->w) && (rect.y == this->y) && (rect.h == this->h);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Rect::inside(int16_t test_x, int16_t test_y, bool absolute) { // NOLINT
|
||||||
if (!this->is_set()) {
|
if (!this->is_set()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (absolute) {
|
if (absolute) {
|
||||||
return ((x >= 0) && (x <= this->w) && (y >= 0) && (y <= this->h));
|
return ((test_x >= this->x) && (test_x <= this->x2()) && (test_y >= this->y) && (test_y <= this->y2()));
|
||||||
} else {
|
} else {
|
||||||
return ((x >= this->x) && (x <= this->x2()) && (y >= this->y) && (y <= this->y2()));
|
return ((test_x >= 0) && (test_x <= this->w) && (test_y >= 0) && (test_y <= this->h));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,15 +88,16 @@ bool Rect::inside(Rect rect, bool absolute) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (absolute) {
|
if (absolute) {
|
||||||
return ((rect.x <= this->w) && (rect.w >= 0) && (rect.y <= this->h) && (rect.h >= 0));
|
|
||||||
} else {
|
|
||||||
return ((rect.x <= this->x2()) && (rect.x2() >= this->x) && (rect.y <= this->y2()) && (rect.y2() >= this->y));
|
return ((rect.x <= this->x2()) && (rect.x2() >= this->x) && (rect.y <= this->y2()) && (rect.y2() >= this->y));
|
||||||
|
} else {
|
||||||
|
return ((rect.x <= this->w) && (rect.w >= 0) && (rect.y <= this->h) && (rect.h >= 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Rect::info(const std::string &prefix) {
|
void Rect::info(const std::string &prefix) {
|
||||||
if (this->is_set()) {
|
if (this->is_set()) {
|
||||||
ESP_LOGI(TAG, "%s [%3d,%3d,%3d,%3d]", prefix.c_str(), this->x, this->y, this->w, this->h);
|
ESP_LOGI(TAG, "%s [%3d,%3d,%3d,%3d] (%3d,%3d)", prefix.c_str(), this->x, this->y, this->w, this->h, this->x2(),
|
||||||
|
this->y2());
|
||||||
} else
|
} else
|
||||||
ESP_LOGI(TAG, "%s ** IS NOT SET **", prefix.c_str());
|
ESP_LOGI(TAG, "%s ** IS NOT SET **", prefix.c_str());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,8 +120,9 @@ class Rect {
|
|||||||
void extend(Rect rect);
|
void extend(Rect rect);
|
||||||
void shrink(Rect rect);
|
void shrink(Rect rect);
|
||||||
|
|
||||||
bool inside(Rect rect, bool absolute = false);
|
bool inside(Rect rect, bool absolute = true);
|
||||||
bool inside(int16_t x, int16_t y, bool absolute = false);
|
bool inside(int16_t test_x, int16_t test_y, bool absolute = true);
|
||||||
|
bool equal(Rect rect);
|
||||||
void info(const std::string &prefix = "rect info:");
|
void info(const std::string &prefix = "rect info:");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ CONF_BLE_ID = "ble_id"
|
|||||||
|
|
||||||
NO_BLUTOOTH_VARIANTS = [const.VARIANT_ESP32S2]
|
NO_BLUTOOTH_VARIANTS = [const.VARIANT_ESP32S2]
|
||||||
|
|
||||||
|
NO_BLUTOOTH_VARIANTS = [const.VARIANT_ESP32S2]
|
||||||
|
|
||||||
esp32_ble_ns = cg.esphome_ns.namespace("esp32_ble")
|
esp32_ble_ns = cg.esphome_ns.namespace("esp32_ble")
|
||||||
ESP32BLE = esp32_ble_ns.class_("ESP32BLE", cg.Component)
|
ESP32BLE = esp32_ble_ns.class_("ESP32BLE", cg.Component)
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ from esphome.const import (
|
|||||||
CONF_VOLTAGE_ATTENUATION,
|
CONF_VOLTAGE_ATTENUATION,
|
||||||
)
|
)
|
||||||
from esphome.core import TimePeriod
|
from esphome.core import TimePeriod
|
||||||
|
from esphome.components import esp32
|
||||||
|
|
||||||
AUTO_LOAD = ["binary_sensor"]
|
AUTO_LOAD = ["binary_sensor"]
|
||||||
DEPENDENCIES = ["esp32"]
|
DEPENDENCIES = ["esp32"]
|
||||||
@@ -50,30 +51,37 @@ VOLTAGE_ATTENUATION = {
|
|||||||
"0V": cg.global_ns.TOUCH_HVOLT_ATTEN_0V,
|
"0V": cg.global_ns.TOUCH_HVOLT_ATTEN_0V,
|
||||||
}
|
}
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.Schema(
|
CONFIG_SCHEMA = cv.All(
|
||||||
{
|
cv.Schema(
|
||||||
cv.GenerateID(): cv.declare_id(ESP32TouchComponent),
|
{
|
||||||
cv.Optional(CONF_SETUP_MODE, default=False): cv.boolean,
|
cv.GenerateID(): cv.declare_id(ESP32TouchComponent),
|
||||||
cv.Optional(
|
cv.Optional(CONF_SETUP_MODE, default=False): cv.boolean,
|
||||||
CONF_IIR_FILTER, default="0ms"
|
cv.Optional(
|
||||||
): cv.positive_time_period_milliseconds,
|
CONF_IIR_FILTER, default="0ms"
|
||||||
cv.Optional(CONF_SLEEP_DURATION, default="27306us"): cv.All(
|
): cv.positive_time_period_milliseconds,
|
||||||
cv.positive_time_period, cv.Range(max=TimePeriod(microseconds=436906))
|
cv.Optional(CONF_SLEEP_DURATION, default="27306us"): cv.All(
|
||||||
),
|
cv.positive_time_period, cv.Range(max=TimePeriod(microseconds=436906))
|
||||||
cv.Optional(CONF_MEASUREMENT_DURATION, default="8192us"): cv.All(
|
),
|
||||||
cv.positive_time_period, cv.Range(max=TimePeriod(microseconds=8192))
|
cv.Optional(CONF_MEASUREMENT_DURATION, default="8192us"): cv.All(
|
||||||
),
|
cv.positive_time_period, cv.Range(max=TimePeriod(microseconds=8192))
|
||||||
cv.Optional(CONF_LOW_VOLTAGE_REFERENCE, default="0.5V"): validate_voltage(
|
),
|
||||||
LOW_VOLTAGE_REFERENCE
|
cv.Optional(CONF_LOW_VOLTAGE_REFERENCE, default="0.5V"): validate_voltage(
|
||||||
),
|
LOW_VOLTAGE_REFERENCE
|
||||||
cv.Optional(CONF_HIGH_VOLTAGE_REFERENCE, default="2.7V"): validate_voltage(
|
),
|
||||||
HIGH_VOLTAGE_REFERENCE
|
cv.Optional(CONF_HIGH_VOLTAGE_REFERENCE, default="2.7V"): validate_voltage(
|
||||||
),
|
HIGH_VOLTAGE_REFERENCE
|
||||||
cv.Optional(CONF_VOLTAGE_ATTENUATION, default="0V"): validate_voltage(
|
),
|
||||||
VOLTAGE_ATTENUATION
|
cv.Optional(CONF_VOLTAGE_ATTENUATION, default="0V"): validate_voltage(
|
||||||
),
|
VOLTAGE_ATTENUATION
|
||||||
}
|
),
|
||||||
).extend(cv.COMPONENT_SCHEMA)
|
}
|
||||||
|
).extend(cv.COMPONENT_SCHEMA),
|
||||||
|
esp32.only_on_variant(
|
||||||
|
supported=[
|
||||||
|
esp32.const.VARIANT_ESP32,
|
||||||
|
]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
|
from esphome.core import CORE
|
||||||
from esphome.components import binary_sensor
|
from esphome.components import binary_sensor
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
CONF_PIN,
|
CONF_PIN,
|
||||||
@@ -7,6 +8,13 @@ from esphome.const import (
|
|||||||
CONF_ID,
|
CONF_ID,
|
||||||
)
|
)
|
||||||
from esphome.components.esp32 import gpio
|
from esphome.components.esp32 import gpio
|
||||||
|
from esphome.components.esp32.const import (
|
||||||
|
KEY_ESP32,
|
||||||
|
KEY_VARIANT,
|
||||||
|
VARIANT_ESP32,
|
||||||
|
VARIANT_ESP32S2,
|
||||||
|
VARIANT_ESP32S3,
|
||||||
|
)
|
||||||
from . import esp32_touch_ns, ESP32TouchComponent
|
from . import esp32_touch_ns, ESP32TouchComponent
|
||||||
|
|
||||||
DEPENDENCIES = ["esp32_touch", "esp32"]
|
DEPENDENCIES = ["esp32_touch", "esp32"]
|
||||||
@@ -15,24 +23,63 @@ CONF_ESP32_TOUCH_ID = "esp32_touch_id"
|
|||||||
CONF_WAKEUP_THRESHOLD = "wakeup_threshold"
|
CONF_WAKEUP_THRESHOLD = "wakeup_threshold"
|
||||||
|
|
||||||
TOUCH_PADS = {
|
TOUCH_PADS = {
|
||||||
4: cg.global_ns.TOUCH_PAD_NUM0,
|
VARIANT_ESP32: {
|
||||||
0: cg.global_ns.TOUCH_PAD_NUM1,
|
4: cg.global_ns.TOUCH_PAD_NUM0,
|
||||||
2: cg.global_ns.TOUCH_PAD_NUM2,
|
0: cg.global_ns.TOUCH_PAD_NUM1,
|
||||||
15: cg.global_ns.TOUCH_PAD_NUM3,
|
2: cg.global_ns.TOUCH_PAD_NUM2,
|
||||||
13: cg.global_ns.TOUCH_PAD_NUM4,
|
15: cg.global_ns.TOUCH_PAD_NUM3,
|
||||||
12: cg.global_ns.TOUCH_PAD_NUM5,
|
13: cg.global_ns.TOUCH_PAD_NUM4,
|
||||||
14: cg.global_ns.TOUCH_PAD_NUM6,
|
12: cg.global_ns.TOUCH_PAD_NUM5,
|
||||||
27: cg.global_ns.TOUCH_PAD_NUM7,
|
14: cg.global_ns.TOUCH_PAD_NUM6,
|
||||||
33: cg.global_ns.TOUCH_PAD_NUM8,
|
27: cg.global_ns.TOUCH_PAD_NUM7,
|
||||||
32: cg.global_ns.TOUCH_PAD_NUM9,
|
33: cg.global_ns.TOUCH_PAD_NUM8,
|
||||||
|
32: cg.global_ns.TOUCH_PAD_NUM9,
|
||||||
|
},
|
||||||
|
VARIANT_ESP32S2: {
|
||||||
|
1: cg.global_ns.TOUCH_PAD_NUM1,
|
||||||
|
2: cg.global_ns.TOUCH_PAD_NUM2,
|
||||||
|
3: cg.global_ns.TOUCH_PAD_NUM3,
|
||||||
|
4: cg.global_ns.TOUCH_PAD_NUM4,
|
||||||
|
5: cg.global_ns.TOUCH_PAD_NUM5,
|
||||||
|
6: cg.global_ns.TOUCH_PAD_NUM6,
|
||||||
|
7: cg.global_ns.TOUCH_PAD_NUM7,
|
||||||
|
8: cg.global_ns.TOUCH_PAD_NUM8,
|
||||||
|
9: cg.global_ns.TOUCH_PAD_NUM9,
|
||||||
|
10: cg.global_ns.TOUCH_PAD_NUM10,
|
||||||
|
11: cg.global_ns.TOUCH_PAD_NUM11,
|
||||||
|
12: cg.global_ns.TOUCH_PAD_NUM12,
|
||||||
|
13: cg.global_ns.TOUCH_PAD_NUM13,
|
||||||
|
14: cg.global_ns.TOUCH_PAD_NUM14,
|
||||||
|
},
|
||||||
|
VARIANT_ESP32S3: {
|
||||||
|
1: cg.global_ns.TOUCH_PAD_NUM1,
|
||||||
|
2: cg.global_ns.TOUCH_PAD_NUM2,
|
||||||
|
3: cg.global_ns.TOUCH_PAD_NUM3,
|
||||||
|
4: cg.global_ns.TOUCH_PAD_NUM4,
|
||||||
|
5: cg.global_ns.TOUCH_PAD_NUM5,
|
||||||
|
6: cg.global_ns.TOUCH_PAD_NUM6,
|
||||||
|
7: cg.global_ns.TOUCH_PAD_NUM7,
|
||||||
|
8: cg.global_ns.TOUCH_PAD_NUM8,
|
||||||
|
9: cg.global_ns.TOUCH_PAD_NUM9,
|
||||||
|
10: cg.global_ns.TOUCH_PAD_NUM10,
|
||||||
|
11: cg.global_ns.TOUCH_PAD_NUM11,
|
||||||
|
12: cg.global_ns.TOUCH_PAD_NUM12,
|
||||||
|
13: cg.global_ns.TOUCH_PAD_NUM13,
|
||||||
|
14: cg.global_ns.TOUCH_PAD_NUM14,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def validate_touch_pad(value):
|
def validate_touch_pad(value):
|
||||||
value = gpio.validate_gpio_pin(value)
|
value = gpio.validate_gpio_pin(value)
|
||||||
if value not in TOUCH_PADS:
|
variant = CORE.data[KEY_ESP32][KEY_VARIANT]
|
||||||
|
if variant not in TOUCH_PADS:
|
||||||
|
raise cv.Invalid(f"ESP32 variant {variant} does not support touch pads.")
|
||||||
|
|
||||||
|
pads = TOUCH_PADS[variant]
|
||||||
|
if value not in pads:
|
||||||
raise cv.Invalid(f"Pin {value} does not support touch pads.")
|
raise cv.Invalid(f"Pin {value} does not support touch pads.")
|
||||||
return value
|
return cv.enum(pads)(value)
|
||||||
|
|
||||||
|
|
||||||
ESP32TouchBinarySensor = esp32_touch_ns.class_(
|
ESP32TouchBinarySensor = esp32_touch_ns.class_(
|
||||||
@@ -53,7 +100,7 @@ async def to_code(config):
|
|||||||
hub = await cg.get_variable(config[CONF_ESP32_TOUCH_ID])
|
hub = await cg.get_variable(config[CONF_ESP32_TOUCH_ID])
|
||||||
var = cg.new_Pvariable(
|
var = cg.new_Pvariable(
|
||||||
config[CONF_ID],
|
config[CONF_ID],
|
||||||
TOUCH_PADS[config[CONF_PIN]],
|
config[CONF_PIN],
|
||||||
config[CONF_THRESHOLD],
|
config[CONF_THRESHOLD],
|
||||||
config[CONF_WAKEUP_THRESHOLD],
|
config[CONF_WAKEUP_THRESHOLD],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -16,7 +16,13 @@ from esphome.const import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
DEPENDENCIES = ["spi"]
|
DEPENDENCIES = ["spi"]
|
||||||
AUTO_LOAD = ["psram"]
|
|
||||||
|
|
||||||
|
def AUTO_LOAD():
|
||||||
|
if CORE.is_esp32:
|
||||||
|
return ["psram"]
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
CODEOWNERS = ["@nielsnl68"]
|
CODEOWNERS = ["@nielsnl68"]
|
||||||
|
|
||||||
@@ -60,6 +66,16 @@ def _validate(config):
|
|||||||
raise cv.Invalid(
|
raise cv.Invalid(
|
||||||
"Providing color palette images requires palette mode to be 'IMAGE_ADAPTIVE'"
|
"Providing color palette images requires palette mode to be 'IMAGE_ADAPTIVE'"
|
||||||
)
|
)
|
||||||
|
if CORE.is_esp8266 and config.get(CONF_MODEL) not in [
|
||||||
|
"M5STACK",
|
||||||
|
"TFT_2.4",
|
||||||
|
"TFT_2.4R",
|
||||||
|
"ILI9341",
|
||||||
|
"ILI9342",
|
||||||
|
]:
|
||||||
|
raise cv.Invalid(
|
||||||
|
"Provided model can't run on ESP8266. Use an ESP32 with PSRAM onboard"
|
||||||
|
)
|
||||||
return config
|
return config
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ const float GRAVITY_EARTH = 9.80665f;
|
|||||||
void MPU6050Component::setup() {
|
void MPU6050Component::setup() {
|
||||||
ESP_LOGCONFIG(TAG, "Setting up MPU6050...");
|
ESP_LOGCONFIG(TAG, "Setting up MPU6050...");
|
||||||
uint8_t who_am_i;
|
uint8_t who_am_i;
|
||||||
if (!this->read_byte(MPU6050_REGISTER_WHO_AM_I, &who_am_i) || (who_am_i != 0x68 && who_am_i != 0x98)) {
|
if (!this->read_byte(MPU6050_REGISTER_WHO_AM_I, &who_am_i) ||
|
||||||
|
(who_am_i != 0x68 && who_am_i != 0x70 && who_am_i != 0x98)) {
|
||||||
this->mark_failed();
|
this->mark_failed();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -448,7 +448,7 @@ void Pipsolar::loop() {
|
|||||||
ESP_LOGD(TAG, "Decode QPIGS");
|
ESP_LOGD(TAG, "Decode QPIGS");
|
||||||
sscanf( // NOLINT
|
sscanf( // NOLINT
|
||||||
tmp, // NOLINT
|
tmp, // NOLINT
|
||||||
"(%f %f %f %f %d %d %d %d %f %d %d %d %d %f %f %d %1d%1d%1d%1d%1d%1d%1d%1d %d %d %d %1d%1d%1d", // NOLINT
|
"(%f %f %f %f %d %d %d %d %f %d %d %d %f %f %f %d %1d%1d%1d%1d%1d%1d%1d%1d %d %d %d %1d%1d%1d", // NOLINT
|
||||||
&value_grid_voltage_, &value_grid_frequency_, &value_ac_output_voltage_, // NOLINT
|
&value_grid_voltage_, &value_grid_frequency_, &value_ac_output_voltage_, // NOLINT
|
||||||
&value_ac_output_frequency_, // NOLINT
|
&value_ac_output_frequency_, // NOLINT
|
||||||
&value_ac_output_apparent_power_, &value_ac_output_active_power_, &value_output_load_percent_, // NOLINT
|
&value_ac_output_apparent_power_, &value_ac_output_active_power_, &value_output_load_percent_, // NOLINT
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ class Pipsolar : public uart::UARTDevice, public PollingComponent {
|
|||||||
PIPSOLAR_SENSOR(battery_charging_current, QPIGS, int)
|
PIPSOLAR_SENSOR(battery_charging_current, QPIGS, int)
|
||||||
PIPSOLAR_SENSOR(battery_capacity_percent, QPIGS, int)
|
PIPSOLAR_SENSOR(battery_capacity_percent, QPIGS, int)
|
||||||
PIPSOLAR_SENSOR(inverter_heat_sink_temperature, QPIGS, int)
|
PIPSOLAR_SENSOR(inverter_heat_sink_temperature, QPIGS, int)
|
||||||
PIPSOLAR_SENSOR(pv_input_current_for_battery, QPIGS, int)
|
PIPSOLAR_SENSOR(pv_input_current_for_battery, QPIGS, float)
|
||||||
PIPSOLAR_SENSOR(pv_input_voltage, QPIGS, float)
|
PIPSOLAR_SENSOR(pv_input_voltage, QPIGS, float)
|
||||||
PIPSOLAR_SENSOR(battery_voltage_scc, QPIGS, float)
|
PIPSOLAR_SENSOR(battery_voltage_scc, QPIGS, float)
|
||||||
PIPSOLAR_SENSOR(battery_discharge_current, QPIGS, int)
|
PIPSOLAR_SENSOR(battery_discharge_current, QPIGS, int)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from esphome.const import (
|
|||||||
CONF_CO2,
|
CONF_CO2,
|
||||||
CONF_UPDATE_INTERVAL,
|
CONF_UPDATE_INTERVAL,
|
||||||
CONF_VALUE,
|
CONF_VALUE,
|
||||||
|
DEVICE_CLASS_CARBON_DIOXIDE,
|
||||||
DEVICE_CLASS_HUMIDITY,
|
DEVICE_CLASS_HUMIDITY,
|
||||||
DEVICE_CLASS_TEMPERATURE,
|
DEVICE_CLASS_TEMPERATURE,
|
||||||
STATE_CLASS_MEASUREMENT,
|
STATE_CLASS_MEASUREMENT,
|
||||||
@@ -46,6 +47,7 @@ CONFIG_SCHEMA = (
|
|||||||
unit_of_measurement=UNIT_PARTS_PER_MILLION,
|
unit_of_measurement=UNIT_PARTS_PER_MILLION,
|
||||||
icon=ICON_MOLECULE_CO2,
|
icon=ICON_MOLECULE_CO2,
|
||||||
accuracy_decimals=0,
|
accuracy_decimals=0,
|
||||||
|
device_class=DEVICE_CLASS_CARBON_DIOXIDE,
|
||||||
state_class=STATE_CLASS_MEASUREMENT,
|
state_class=STATE_CLASS_MEASUREMENT,
|
||||||
),
|
),
|
||||||
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
||||||
|
|||||||
@@ -477,7 +477,6 @@ void Sprinkler::configure_valve_switch(size_t valve_number, switch_::Switch *val
|
|||||||
if (this->is_a_valid_valve(valve_number)) {
|
if (this->is_a_valid_valve(valve_number)) {
|
||||||
this->valve_[valve_number].valve_switch.set_on_switch(valve_switch);
|
this->valve_[valve_number].valve_switch.set_on_switch(valve_switch);
|
||||||
this->valve_[valve_number].run_duration = run_duration;
|
this->valve_[valve_number].run_duration = run_duration;
|
||||||
valve_switch->turn_off();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -489,8 +488,6 @@ void Sprinkler::configure_valve_switch_pulsed(size_t valve_number, switch_::Swit
|
|||||||
this->valve_[valve_number].valve_switch.set_on_switch(valve_switch_on);
|
this->valve_[valve_number].valve_switch.set_on_switch(valve_switch_on);
|
||||||
this->valve_[valve_number].valve_switch.set_pulse_duration(pulse_duration);
|
this->valve_[valve_number].valve_switch.set_pulse_duration(pulse_duration);
|
||||||
this->valve_[valve_number].run_duration = run_duration;
|
this->valve_[valve_number].run_duration = run_duration;
|
||||||
valve_switch_off->turn_off();
|
|
||||||
valve_switch_on->turn_off();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -505,7 +502,6 @@ void Sprinkler::configure_valve_pump_switch(size_t valve_number, switch_::Switch
|
|||||||
this->pump_.resize(this->pump_.size() + 1);
|
this->pump_.resize(this->pump_.size() + 1);
|
||||||
this->pump_.back().set_on_switch(pump_switch);
|
this->pump_.back().set_on_switch(pump_switch);
|
||||||
this->valve_[valve_number].pump_switch_index = this->pump_.size() - 1; // save the index to the new pump
|
this->valve_[valve_number].pump_switch_index = this->pump_.size() - 1; // save the index to the new pump
|
||||||
pump_switch->turn_off();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -524,8 +520,6 @@ void Sprinkler::configure_valve_pump_switch_pulsed(size_t valve_number, switch_:
|
|||||||
this->pump_.back().set_on_switch(pump_switch_on);
|
this->pump_.back().set_on_switch(pump_switch_on);
|
||||||
this->pump_.back().set_pulse_duration(pulse_duration);
|
this->pump_.back().set_pulse_duration(pulse_duration);
|
||||||
this->valve_[valve_number].pump_switch_index = this->pump_.size() - 1; // save the index to the new pump
|
this->valve_[valve_number].pump_switch_index = this->pump_.size() - 1; // save the index to the new pump
|
||||||
pump_switch_off->turn_off();
|
|
||||||
pump_switch_on->turn_off();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ class SprinklerControllerNumber : public number::Number, public Component {
|
|||||||
public:
|
public:
|
||||||
void setup() override;
|
void setup() override;
|
||||||
void dump_config() override;
|
void dump_config() override;
|
||||||
float get_setup_priority() const override { return setup_priority::HARDWARE; }
|
float get_setup_priority() const override { return setup_priority::PROCESSOR; }
|
||||||
|
|
||||||
Trigger<float> *get_set_trigger() const { return set_trigger_; }
|
Trigger<float> *get_set_trigger() const { return set_trigger_; }
|
||||||
void set_initial_value(float initial_value) { initial_value_ = initial_value; }
|
void set_initial_value(float initial_value) { initial_value_ = initial_value; }
|
||||||
|
|||||||
@@ -5,6 +5,10 @@
|
|||||||
#include "esphome/core/util.h"
|
#include "esphome/core/util.h"
|
||||||
#include "esphome/core/gpio.h"
|
#include "esphome/core/gpio.h"
|
||||||
|
|
||||||
|
#ifdef USE_WIFI
|
||||||
|
#include "esphome/components/wifi/wifi_component.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef USE_CAPTIVE_PORTAL
|
#ifdef USE_CAPTIVE_PORTAL
|
||||||
#include "esphome/components/captive_portal/captive_portal.h"
|
#include "esphome/components/captive_portal/captive_portal.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -234,6 +238,10 @@ void Tuya::handle_command_(uint8_t command, uint8_t version, const uint8_t *buff
|
|||||||
case TuyaCommandType::WIFI_TEST:
|
case TuyaCommandType::WIFI_TEST:
|
||||||
this->send_command_(TuyaCommand{.cmd = TuyaCommandType::WIFI_TEST, .payload = std::vector<uint8_t>{0x00, 0x00}});
|
this->send_command_(TuyaCommand{.cmd = TuyaCommandType::WIFI_TEST, .payload = std::vector<uint8_t>{0x00, 0x00}});
|
||||||
break;
|
break;
|
||||||
|
case TuyaCommandType::WIFI_RSSI:
|
||||||
|
this->send_command_(
|
||||||
|
TuyaCommand{.cmd = TuyaCommandType::WIFI_RSSI, .payload = std::vector<uint8_t>{get_wifi_rssi_()}});
|
||||||
|
break;
|
||||||
case TuyaCommandType::LOCAL_TIME_QUERY:
|
case TuyaCommandType::LOCAL_TIME_QUERY:
|
||||||
#ifdef USE_TIME
|
#ifdef USE_TIME
|
||||||
if (this->time_id_.has_value()) {
|
if (this->time_id_.has_value()) {
|
||||||
@@ -475,6 +483,15 @@ uint8_t Tuya::get_wifi_status_code_() {
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t Tuya::get_wifi_rssi_() {
|
||||||
|
#ifdef USE_WIFI
|
||||||
|
if (wifi::global_wifi_component != nullptr)
|
||||||
|
return wifi::global_wifi_component->wifi_rssi();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void Tuya::send_wifi_status_() {
|
void Tuya::send_wifi_status_() {
|
||||||
uint8_t status = this->get_wifi_status_code_();
|
uint8_t status = this->get_wifi_status_code_();
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ enum class TuyaCommandType : uint8_t {
|
|||||||
DATAPOINT_QUERY = 0x08,
|
DATAPOINT_QUERY = 0x08,
|
||||||
WIFI_TEST = 0x0E,
|
WIFI_TEST = 0x0E,
|
||||||
LOCAL_TIME_QUERY = 0x1C,
|
LOCAL_TIME_QUERY = 0x1C,
|
||||||
|
WIFI_RSSI = 0x24,
|
||||||
VACUUM_MAP_UPLOAD = 0x28,
|
VACUUM_MAP_UPLOAD = 0x28,
|
||||||
GET_NETWORK_STATUS = 0x2B,
|
GET_NETWORK_STATUS = 0x2B,
|
||||||
};
|
};
|
||||||
@@ -123,6 +124,7 @@ class Tuya : public Component, public uart::UARTDevice {
|
|||||||
void set_status_pin_();
|
void set_status_pin_();
|
||||||
void send_wifi_status_();
|
void send_wifi_status_();
|
||||||
uint8_t get_wifi_status_code_();
|
uint8_t get_wifi_status_code_();
|
||||||
|
uint8_t get_wifi_rssi_();
|
||||||
|
|
||||||
#ifdef USE_TIME
|
#ifdef USE_TIME
|
||||||
void send_local_time_();
|
void send_local_time_();
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import esphome.config_validation as cv
|
|||||||
from esphome.components import sensor
|
from esphome.components import sensor
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
ENTITY_CATEGORY_DIAGNOSTIC,
|
ENTITY_CATEGORY_DIAGNOSTIC,
|
||||||
|
STATE_CLASS_TOTAL_INCREASING,
|
||||||
UNIT_SECOND,
|
UNIT_SECOND,
|
||||||
ICON_TIMER,
|
ICON_TIMER,
|
||||||
DEVICE_CLASS_DURATION,
|
DEVICE_CLASS_DURATION,
|
||||||
@@ -16,6 +17,7 @@ CONFIG_SCHEMA = sensor.sensor_schema(
|
|||||||
unit_of_measurement=UNIT_SECOND,
|
unit_of_measurement=UNIT_SECOND,
|
||||||
icon=ICON_TIMER,
|
icon=ICON_TIMER,
|
||||||
accuracy_decimals=0,
|
accuracy_decimals=0,
|
||||||
|
state_class=STATE_CLASS_TOTAL_INCREASING,
|
||||||
device_class=DEVICE_CLASS_DURATION,
|
device_class=DEVICE_CLASS_DURATION,
|
||||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||||
).extend(cv.polling_component_schema("60s"))
|
).extend(cv.polling_component_schema("60s"))
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""Constants used by esphome."""
|
"""Constants used by esphome."""
|
||||||
|
|
||||||
__version__ = "2023.3.0b2"
|
__version__ = "2023.3.0"
|
||||||
|
|
||||||
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
|
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
|
||||||
|
|
||||||
|
|||||||
@@ -71,7 +71,10 @@ class ComponentManifest:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def auto_load(self) -> list[str]:
|
def auto_load(self) -> list[str]:
|
||||||
return getattr(self.module, "AUTO_LOAD", [])
|
al = getattr(self.module, "AUTO_LOAD", [])
|
||||||
|
if callable(al):
|
||||||
|
return al()
|
||||||
|
return al
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def codeowners(self) -> list[str]:
|
def codeowners(self) -> list[str]:
|
||||||
|
|||||||
@@ -2528,6 +2528,8 @@ color:
|
|||||||
red: 0%
|
red: 0%
|
||||||
green: 1%
|
green: 1%
|
||||||
blue: 100%
|
blue: 100%
|
||||||
|
- id: kbx_green
|
||||||
|
hex: "3DEC55"
|
||||||
|
|
||||||
display:
|
display:
|
||||||
- platform: lcd_gpio
|
- platform: lcd_gpio
|
||||||
|
|||||||
Reference in New Issue
Block a user