mirror of
https://github.com/esphome/esphome.git
synced 2025-08-10 20:29:24 +00:00
Compare commits
108 Commits
2023.3.0b2
...
2023.3.1
Author | SHA1 | Date | |
---|---|---|---|
![]() |
dd8dc1ef1d | ||
![]() |
bc427de16a | ||
![]() |
db5988bbe1 | ||
![]() |
a3875af4b4 | ||
![]() |
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 |
@@ -324,6 +324,10 @@ async def setup_climate_core_(var, config):
|
||||
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
|
||||
await automation.build_automation(trigger, [], conf)
|
||||
|
||||
for conf in config.get(CONF_ON_CONTROL, []):
|
||||
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
|
||||
await automation.build_automation(trigger, [], conf)
|
||||
|
||||
|
||||
async def register_climate(var, config):
|
||||
if not CORE.has_id(config[CONF_ID]):
|
||||
|
@@ -10,23 +10,42 @@ CONF_RED_INT = "red_int"
|
||||
CONF_GREEN_INT = "green_int"
|
||||
CONF_BLUE_INT = "blue_int"
|
||||
CONF_WHITE_INT = "white_int"
|
||||
|
||||
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)
|
||||
CONF_HEX = "hex"
|
||||
|
||||
|
||||
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
|
||||
if CONF_RED in config:
|
||||
r = int(config[CONF_RED] * 255)
|
||||
@@ -51,6 +70,16 @@ async def to_code(config):
|
||||
elif CONF_WHITE_INT in config:
|
||||
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(
|
||||
config[CONF_ID],
|
||||
cg.StructInitializer(ColorStruct, ("r", r), ("g", g), ("b", b), ("w", w)),
|
||||
|
@@ -32,9 +32,11 @@ void Rect::extend(Rect rect) {
|
||||
this->h = rect.h;
|
||||
} else {
|
||||
if (this->x > rect.x) {
|
||||
this->w = this->w + (this->x - rect.x);
|
||||
this->x = rect.x;
|
||||
}
|
||||
if (this->y > rect.y) {
|
||||
this->h = this->h + (this->y - rect.y);
|
||||
this->y = rect.y;
|
||||
}
|
||||
if (this->x2() < rect.x2()) {
|
||||
@@ -49,29 +51,35 @@ void Rect::shrink(Rect rect) {
|
||||
if (!this->inside(rect)) {
|
||||
(*this) = Rect();
|
||||
} else {
|
||||
if (this->x < rect.x) {
|
||||
this->x = rect.x;
|
||||
}
|
||||
if (this->y < rect.y) {
|
||||
this->y = rect.y;
|
||||
}
|
||||
if (this->x2() > rect.x2()) {
|
||||
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()) {
|
||||
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()) {
|
||||
return true;
|
||||
}
|
||||
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 {
|
||||
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;
|
||||
}
|
||||
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));
|
||||
} else {
|
||||
return ((rect.x <= this->w) && (rect.w >= 0) && (rect.y <= this->h) && (rect.h >= 0));
|
||||
}
|
||||
}
|
||||
|
||||
void Rect::info(const std::string &prefix) {
|
||||
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
|
||||
ESP_LOGI(TAG, "%s ** IS NOT SET **", prefix.c_str());
|
||||
}
|
||||
|
@@ -120,8 +120,9 @@ class Rect {
|
||||
void extend(Rect rect);
|
||||
void shrink(Rect rect);
|
||||
|
||||
bool inside(Rect rect, bool absolute = false);
|
||||
bool inside(int16_t x, int16_t y, bool absolute = false);
|
||||
bool inside(Rect rect, bool absolute = true);
|
||||
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:");
|
||||
};
|
||||
|
||||
|
@@ -12,6 +12,8 @@ CONF_BLE_ID = "ble_id"
|
||||
|
||||
NO_BLUTOOTH_VARIANTS = [const.VARIANT_ESP32S2]
|
||||
|
||||
NO_BLUTOOTH_VARIANTS = [const.VARIANT_ESP32S2]
|
||||
|
||||
esp32_ble_ns = cg.esphome_ns.namespace("esp32_ble")
|
||||
ESP32BLE = esp32_ble_ns.class_("ESP32BLE", cg.Component)
|
||||
|
||||
|
@@ -11,6 +11,7 @@ from esphome.const import (
|
||||
CONF_VOLTAGE_ATTENUATION,
|
||||
)
|
||||
from esphome.core import TimePeriod
|
||||
from esphome.components import esp32
|
||||
|
||||
AUTO_LOAD = ["binary_sensor"]
|
||||
DEPENDENCIES = ["esp32"]
|
||||
@@ -50,30 +51,37 @@ VOLTAGE_ATTENUATION = {
|
||||
"0V": cg.global_ns.TOUCH_HVOLT_ATTEN_0V,
|
||||
}
|
||||
|
||||
CONFIG_SCHEMA = cv.Schema(
|
||||
{
|
||||
cv.GenerateID(): cv.declare_id(ESP32TouchComponent),
|
||||
cv.Optional(CONF_SETUP_MODE, default=False): cv.boolean,
|
||||
cv.Optional(
|
||||
CONF_IIR_FILTER, default="0ms"
|
||||
): cv.positive_time_period_milliseconds,
|
||||
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_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_VOLTAGE_ATTENUATION, default="0V"): validate_voltage(
|
||||
VOLTAGE_ATTENUATION
|
||||
),
|
||||
}
|
||||
).extend(cv.COMPONENT_SCHEMA)
|
||||
CONFIG_SCHEMA = cv.All(
|
||||
cv.Schema(
|
||||
{
|
||||
cv.GenerateID(): cv.declare_id(ESP32TouchComponent),
|
||||
cv.Optional(CONF_SETUP_MODE, default=False): cv.boolean,
|
||||
cv.Optional(
|
||||
CONF_IIR_FILTER, default="0ms"
|
||||
): cv.positive_time_period_milliseconds,
|
||||
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_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_VOLTAGE_ATTENUATION, default="0V"): validate_voltage(
|
||||
VOLTAGE_ATTENUATION
|
||||
),
|
||||
}
|
||||
).extend(cv.COMPONENT_SCHEMA),
|
||||
esp32.only_on_variant(
|
||||
supported=[
|
||||
esp32.const.VARIANT_ESP32,
|
||||
]
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
async def to_code(config):
|
||||
|
@@ -1,5 +1,6 @@
|
||||
import esphome.codegen as cg
|
||||
import esphome.config_validation as cv
|
||||
from esphome.core import CORE
|
||||
from esphome.components import binary_sensor
|
||||
from esphome.const import (
|
||||
CONF_PIN,
|
||||
@@ -7,6 +8,13 @@ from esphome.const import (
|
||||
CONF_ID,
|
||||
)
|
||||
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
|
||||
|
||||
DEPENDENCIES = ["esp32_touch", "esp32"]
|
||||
@@ -15,24 +23,63 @@ CONF_ESP32_TOUCH_ID = "esp32_touch_id"
|
||||
CONF_WAKEUP_THRESHOLD = "wakeup_threshold"
|
||||
|
||||
TOUCH_PADS = {
|
||||
4: cg.global_ns.TOUCH_PAD_NUM0,
|
||||
0: cg.global_ns.TOUCH_PAD_NUM1,
|
||||
2: cg.global_ns.TOUCH_PAD_NUM2,
|
||||
15: cg.global_ns.TOUCH_PAD_NUM3,
|
||||
13: cg.global_ns.TOUCH_PAD_NUM4,
|
||||
12: cg.global_ns.TOUCH_PAD_NUM5,
|
||||
14: cg.global_ns.TOUCH_PAD_NUM6,
|
||||
27: cg.global_ns.TOUCH_PAD_NUM7,
|
||||
33: cg.global_ns.TOUCH_PAD_NUM8,
|
||||
32: cg.global_ns.TOUCH_PAD_NUM9,
|
||||
VARIANT_ESP32: {
|
||||
4: cg.global_ns.TOUCH_PAD_NUM0,
|
||||
0: cg.global_ns.TOUCH_PAD_NUM1,
|
||||
2: cg.global_ns.TOUCH_PAD_NUM2,
|
||||
15: cg.global_ns.TOUCH_PAD_NUM3,
|
||||
13: cg.global_ns.TOUCH_PAD_NUM4,
|
||||
12: cg.global_ns.TOUCH_PAD_NUM5,
|
||||
14: cg.global_ns.TOUCH_PAD_NUM6,
|
||||
27: cg.global_ns.TOUCH_PAD_NUM7,
|
||||
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):
|
||||
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.")
|
||||
return value
|
||||
return cv.enum(pads)(value)
|
||||
|
||||
|
||||
ESP32TouchBinarySensor = esp32_touch_ns.class_(
|
||||
@@ -53,7 +100,7 @@ async def to_code(config):
|
||||
hub = await cg.get_variable(config[CONF_ESP32_TOUCH_ID])
|
||||
var = cg.new_Pvariable(
|
||||
config[CONF_ID],
|
||||
TOUCH_PADS[config[CONF_PIN]],
|
||||
config[CONF_PIN],
|
||||
config[CONF_THRESHOLD],
|
||||
config[CONF_WAKEUP_THRESHOLD],
|
||||
)
|
||||
|
@@ -16,7 +16,13 @@ from esphome.const import (
|
||||
)
|
||||
|
||||
DEPENDENCIES = ["spi"]
|
||||
AUTO_LOAD = ["psram"]
|
||||
|
||||
|
||||
def AUTO_LOAD():
|
||||
if CORE.is_esp32:
|
||||
return ["psram"]
|
||||
return []
|
||||
|
||||
|
||||
CODEOWNERS = ["@nielsnl68"]
|
||||
|
||||
@@ -60,6 +66,16 @@ def _validate(config):
|
||||
raise cv.Invalid(
|
||||
"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
|
||||
|
||||
|
||||
|
@@ -23,7 +23,8 @@ const float GRAVITY_EARTH = 9.80665f;
|
||||
void MPU6050Component::setup() {
|
||||
ESP_LOGCONFIG(TAG, "Setting up MPU6050...");
|
||||
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();
|
||||
return;
|
||||
}
|
||||
|
@@ -448,7 +448,7 @@ void Pipsolar::loop() {
|
||||
ESP_LOGD(TAG, "Decode QPIGS");
|
||||
sscanf( // 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_ac_output_frequency_, // 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_capacity_percent, 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(battery_voltage_scc, QPIGS, float)
|
||||
PIPSOLAR_SENSOR(battery_discharge_current, QPIGS, int)
|
||||
|
@@ -10,6 +10,7 @@ from esphome.const import (
|
||||
CONF_CO2,
|
||||
CONF_UPDATE_INTERVAL,
|
||||
CONF_VALUE,
|
||||
DEVICE_CLASS_CARBON_DIOXIDE,
|
||||
DEVICE_CLASS_HUMIDITY,
|
||||
DEVICE_CLASS_TEMPERATURE,
|
||||
STATE_CLASS_MEASUREMENT,
|
||||
@@ -46,6 +47,7 @@ CONFIG_SCHEMA = (
|
||||
unit_of_measurement=UNIT_PARTS_PER_MILLION,
|
||||
icon=ICON_MOLECULE_CO2,
|
||||
accuracy_decimals=0,
|
||||
device_class=DEVICE_CLASS_CARBON_DIOXIDE,
|
||||
state_class=STATE_CLASS_MEASUREMENT,
|
||||
),
|
||||
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)) {
|
||||
this->valve_[valve_number].valve_switch.set_on_switch(valve_switch);
|
||||
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_pulse_duration(pulse_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_.back().set_on_switch(pump_switch);
|
||||
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_pulse_duration(pulse_duration);
|
||||
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:
|
||||
void setup() 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_; }
|
||||
void set_initial_value(float initial_value) { initial_value_ = initial_value; }
|
||||
|
@@ -5,6 +5,10 @@
|
||||
#include "esphome/core/util.h"
|
||||
#include "esphome/core/gpio.h"
|
||||
|
||||
#ifdef USE_WIFI
|
||||
#include "esphome/components/wifi/wifi_component.h"
|
||||
#endif
|
||||
|
||||
#ifdef USE_CAPTIVE_PORTAL
|
||||
#include "esphome/components/captive_portal/captive_portal.h"
|
||||
#endif
|
||||
@@ -234,6 +238,10 @@ void Tuya::handle_command_(uint8_t command, uint8_t version, const uint8_t *buff
|
||||
case TuyaCommandType::WIFI_TEST:
|
||||
this->send_command_(TuyaCommand{.cmd = TuyaCommandType::WIFI_TEST, .payload = std::vector<uint8_t>{0x00, 0x00}});
|
||||
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:
|
||||
#ifdef USE_TIME
|
||||
if (this->time_id_.has_value()) {
|
||||
@@ -475,6 +483,15 @@ uint8_t Tuya::get_wifi_status_code_() {
|
||||
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_() {
|
||||
uint8_t status = this->get_wifi_status_code_();
|
||||
|
||||
|
@@ -55,6 +55,7 @@ enum class TuyaCommandType : uint8_t {
|
||||
DATAPOINT_QUERY = 0x08,
|
||||
WIFI_TEST = 0x0E,
|
||||
LOCAL_TIME_QUERY = 0x1C,
|
||||
WIFI_RSSI = 0x24,
|
||||
VACUUM_MAP_UPLOAD = 0x28,
|
||||
GET_NETWORK_STATUS = 0x2B,
|
||||
};
|
||||
@@ -123,6 +124,7 @@ class Tuya : public Component, public uart::UARTDevice {
|
||||
void set_status_pin_();
|
||||
void send_wifi_status_();
|
||||
uint8_t get_wifi_status_code_();
|
||||
uint8_t get_wifi_rssi_();
|
||||
|
||||
#ifdef USE_TIME
|
||||
void send_local_time_();
|
||||
|
@@ -3,6 +3,7 @@ import esphome.config_validation as cv
|
||||
from esphome.components import sensor
|
||||
from esphome.const import (
|
||||
ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
STATE_CLASS_TOTAL_INCREASING,
|
||||
UNIT_SECOND,
|
||||
ICON_TIMER,
|
||||
DEVICE_CLASS_DURATION,
|
||||
@@ -16,6 +17,7 @@ CONFIG_SCHEMA = sensor.sensor_schema(
|
||||
unit_of_measurement=UNIT_SECOND,
|
||||
icon=ICON_TIMER,
|
||||
accuracy_decimals=0,
|
||||
state_class=STATE_CLASS_TOTAL_INCREASING,
|
||||
device_class=DEVICE_CLASS_DURATION,
|
||||
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
||||
).extend(cv.polling_component_schema("60s"))
|
||||
|
@@ -1,6 +1,6 @@
|
||||
"""Constants used by esphome."""
|
||||
|
||||
__version__ = "2023.3.0b2"
|
||||
__version__ = "2023.3.1"
|
||||
|
||||
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
|
||||
|
||||
|
@@ -393,13 +393,13 @@ void hsv_to_rgb(int hue, float saturation, float value, float &red, float &green
|
||||
}
|
||||
|
||||
// System APIs
|
||||
#if defined(USE_ESP8266)
|
||||
#if defined(USE_ESP8266) || defined(USE_RP2040)
|
||||
// ESP8266 doesn't have mutexes, but that shouldn't be an issue as it's single-core and non-preemptive OS.
|
||||
Mutex::Mutex() {}
|
||||
void Mutex::lock() {}
|
||||
bool Mutex::try_lock() { return true; }
|
||||
void Mutex::unlock() {}
|
||||
#elif defined(USE_ESP32) || defined(USE_RP2040)
|
||||
#elif defined(USE_ESP32)
|
||||
Mutex::Mutex() { handle_ = xSemaphoreCreateMutex(); }
|
||||
void Mutex::lock() { xSemaphoreTake(this->handle_, portMAX_DELAY); }
|
||||
bool Mutex::try_lock() { return xSemaphoreTake(this->handle_, 0) == pdTRUE; }
|
||||
|
@@ -17,9 +17,6 @@
|
||||
#if defined(USE_ESP32)
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/semphr.h>
|
||||
#elif defined(USE_RP2040)
|
||||
#include <FreeRTOS.h>
|
||||
#include <semphr.h>
|
||||
#endif
|
||||
|
||||
#define HOT __attribute__((hot))
|
||||
@@ -539,7 +536,7 @@ class Mutex {
|
||||
Mutex &operator=(const Mutex &) = delete;
|
||||
|
||||
private:
|
||||
#if defined(USE_ESP32) || defined(USE_RP2040)
|
||||
#if defined(USE_ESP32)
|
||||
SemaphoreHandle_t handle_;
|
||||
#endif
|
||||
};
|
||||
|
@@ -71,7 +71,10 @@ class ComponentManifest:
|
||||
|
||||
@property
|
||||
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
|
||||
def codeowners(self) -> list[str]:
|
||||
|
@@ -2528,6 +2528,8 @@ color:
|
||||
red: 0%
|
||||
green: 1%
|
||||
blue: 100%
|
||||
- id: kbx_green
|
||||
hex: "3DEC55"
|
||||
|
||||
display:
|
||||
- platform: lcd_gpio
|
||||
|
Reference in New Issue
Block a user