mirror of
https://github.com/esphome/esphome.git
synced 2025-09-21 20:52:20 +01:00
Merge branch 'dev' into multi_device
This commit is contained in:
@@ -114,13 +114,14 @@ void IRAM_ATTR HOT AcDimmerDataStore::gpio_intr() {
|
|||||||
// fully off, disable output immediately
|
// fully off, disable output immediately
|
||||||
this->gate_pin.digital_write(false);
|
this->gate_pin.digital_write(false);
|
||||||
} else {
|
} else {
|
||||||
|
auto min_us = this->cycle_time_us * this->min_power / 1000;
|
||||||
if (this->method == DIM_METHOD_TRAILING) {
|
if (this->method == DIM_METHOD_TRAILING) {
|
||||||
this->enable_time_us = 1; // cannot be 0
|
this->enable_time_us = 1; // cannot be 0
|
||||||
this->disable_time_us = std::max((uint32_t) 10, this->value * this->cycle_time_us / 65535);
|
// calculate time until disable in µs with integer arithmetic and take into account min_power
|
||||||
|
this->disable_time_us = std::max((uint32_t) 10, this->value * (this->cycle_time_us - min_us) / 65535 + min_us);
|
||||||
} else {
|
} else {
|
||||||
// calculate time until enable in µs: (1.0-value)*cycle_time, but with integer arithmetic
|
// calculate time until enable in µs: (1.0-value)*cycle_time, but with integer arithmetic
|
||||||
// also take into account min_power
|
// also take into account min_power
|
||||||
auto min_us = this->cycle_time_us * this->min_power / 1000;
|
|
||||||
this->enable_time_us = std::max((uint32_t) 1, ((65535 - this->value) * (this->cycle_time_us - min_us)) / 65535);
|
this->enable_time_us = std::max((uint32_t) 1, ((65535 - this->value) * (this->cycle_time_us - min_us)) / 65535);
|
||||||
|
|
||||||
if (this->method == DIM_METHOD_LEADING_PULSE) {
|
if (this->method == DIM_METHOD_LEADING_PULSE) {
|
||||||
|
@@ -265,6 +265,12 @@ void BluetoothProxy::bluetooth_device_request(const api::BluetoothDeviceRequest
|
|||||||
connection->get_connection_index(), connection->address_str().c_str());
|
connection->get_connection_index(), connection->address_str().c_str());
|
||||||
return;
|
return;
|
||||||
} else if (connection->state() == espbt::ClientState::CONNECTING) {
|
} else if (connection->state() == espbt::ClientState::CONNECTING) {
|
||||||
|
if (connection->disconnect_pending()) {
|
||||||
|
ESP_LOGW(TAG, "[%d] [%s] Connection request while pending disconnect, cancelling pending disconnect",
|
||||||
|
connection->get_connection_index(), connection->address_str().c_str());
|
||||||
|
connection->cancel_pending_disconnect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
ESP_LOGW(TAG, "[%d] [%s] Connection request ignored, already connecting", connection->get_connection_index(),
|
ESP_LOGW(TAG, "[%d] [%s] Connection request ignored, already connecting", connection->get_connection_index(),
|
||||||
connection->address_str().c_str());
|
connection->address_str().c_str());
|
||||||
return;
|
return;
|
||||||
|
@@ -173,6 +173,8 @@ class ESPBTClient : public ESPBTDeviceListener {
|
|||||||
virtual void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) = 0;
|
virtual void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) = 0;
|
||||||
virtual void connect() = 0;
|
virtual void connect() = 0;
|
||||||
virtual void disconnect() = 0;
|
virtual void disconnect() = 0;
|
||||||
|
bool disconnect_pending() const { return this->want_disconnect_; }
|
||||||
|
void cancel_pending_disconnect() { this->want_disconnect_ = false; }
|
||||||
virtual void set_state(ClientState st) {
|
virtual void set_state(ClientState st) {
|
||||||
this->state_ = st;
|
this->state_ = st;
|
||||||
if (st == ClientState::IDLE) {
|
if (st == ClientState::IDLE) {
|
||||||
|
@@ -120,6 +120,7 @@ void LvglComponent::add_event_cb(lv_obj_t *obj, event_callback_t callback, lv_ev
|
|||||||
void LvglComponent::add_page(LvPageType *page) {
|
void LvglComponent::add_page(LvPageType *page) {
|
||||||
this->pages_.push_back(page);
|
this->pages_.push_back(page);
|
||||||
page->set_parent(this);
|
page->set_parent(this);
|
||||||
|
lv_disp_set_default(this->disp_);
|
||||||
page->setup(this->pages_.size() - 1);
|
page->setup(this->pages_.size() - 1);
|
||||||
}
|
}
|
||||||
void LvglComponent::show_page(size_t index, lv_scr_load_anim_t anim, uint32_t time) {
|
void LvglComponent::show_page(size_t index, lv_scr_load_anim_t anim, uint32_t time) {
|
||||||
|
@@ -67,12 +67,13 @@ class ArcType(NumberType):
|
|||||||
lv.arc_set_mode(w.obj, literal(config[CONF_MODE]))
|
lv.arc_set_mode(w.obj, literal(config[CONF_MODE]))
|
||||||
lv.arc_set_change_rate(w.obj, config[CONF_CHANGE_RATE])
|
lv.arc_set_change_rate(w.obj, config[CONF_CHANGE_RATE])
|
||||||
|
|
||||||
if config.get(CONF_ADJUSTABLE) is False:
|
if CONF_ADJUSTABLE in config:
|
||||||
lv_obj.remove_style(w.obj, nullptr, literal("LV_PART_KNOB"))
|
if not config[CONF_ADJUSTABLE]:
|
||||||
w.clear_flag("LV_OBJ_FLAG_CLICKABLE")
|
lv_obj.remove_style(w.obj, nullptr, literal("LV_PART_KNOB"))
|
||||||
elif CONF_GROUP not in config:
|
w.clear_flag("LV_OBJ_FLAG_CLICKABLE")
|
||||||
# For some reason arc does not get automatically added to the default group
|
elif CONF_GROUP not in config:
|
||||||
lv.group_add_obj(lv_expr.group_get_default(), w.obj)
|
# For some reason arc does not get automatically added to the default group
|
||||||
|
lv.group_add_obj(lv_expr.group_get_default(), w.obj)
|
||||||
|
|
||||||
value = await get_start_value(config)
|
value = await get_start_value(config)
|
||||||
if value is not None:
|
if value is not None:
|
||||||
|
@@ -36,7 +36,6 @@ DROPDOWN_BASE_SCHEMA = cv.Schema(
|
|||||||
cv.Optional(CONF_SYMBOL): lv_text,
|
cv.Optional(CONF_SYMBOL): lv_text,
|
||||||
cv.Exclusive(CONF_SELECTED_INDEX, CONF_SELECTED_TEXT): lv_int,
|
cv.Exclusive(CONF_SELECTED_INDEX, CONF_SELECTED_TEXT): lv_int,
|
||||||
cv.Exclusive(CONF_SELECTED_TEXT, CONF_SELECTED_TEXT): lv_text,
|
cv.Exclusive(CONF_SELECTED_TEXT, CONF_SELECTED_TEXT): lv_text,
|
||||||
cv.Optional(CONF_DIR, default="BOTTOM"): DIRECTIONS.one_of,
|
|
||||||
cv.Optional(CONF_DROPDOWN_LIST): part_schema(dropdown_list_spec.parts),
|
cv.Optional(CONF_DROPDOWN_LIST): part_schema(dropdown_list_spec.parts),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -44,12 +43,14 @@ DROPDOWN_BASE_SCHEMA = cv.Schema(
|
|||||||
DROPDOWN_SCHEMA = DROPDOWN_BASE_SCHEMA.extend(
|
DROPDOWN_SCHEMA = DROPDOWN_BASE_SCHEMA.extend(
|
||||||
{
|
{
|
||||||
cv.Required(CONF_OPTIONS): cv.ensure_list(option_string),
|
cv.Required(CONF_OPTIONS): cv.ensure_list(option_string),
|
||||||
|
cv.Optional(CONF_DIR, default="BOTTOM"): DIRECTIONS.one_of,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
DROPDOWN_UPDATE_SCHEMA = DROPDOWN_BASE_SCHEMA.extend(
|
DROPDOWN_UPDATE_SCHEMA = DROPDOWN_BASE_SCHEMA.extend(
|
||||||
{
|
{
|
||||||
cv.Optional(CONF_OPTIONS): cv.ensure_list(option_string),
|
cv.Optional(CONF_OPTIONS): cv.ensure_list(option_string),
|
||||||
|
cv.Optional(CONF_DIR): DIRECTIONS.one_of,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -20,8 +20,8 @@ CONF_IMAGE = "image"
|
|||||||
|
|
||||||
BASE_IMG_SCHEMA = cv.Schema(
|
BASE_IMG_SCHEMA = cv.Schema(
|
||||||
{
|
{
|
||||||
cv.Optional(CONF_PIVOT_X, default="50%"): size,
|
cv.Optional(CONF_PIVOT_X): size,
|
||||||
cv.Optional(CONF_PIVOT_Y, default="50%"): size,
|
cv.Optional(CONF_PIVOT_Y): size,
|
||||||
cv.Optional(CONF_ANGLE): angle,
|
cv.Optional(CONF_ANGLE): angle,
|
||||||
cv.Optional(CONF_ZOOM): zoom,
|
cv.Optional(CONF_ZOOM): zoom,
|
||||||
cv.Optional(CONF_OFFSET_X): size,
|
cv.Optional(CONF_OFFSET_X): size,
|
||||||
@@ -63,10 +63,11 @@ class ImgType(WidgetType):
|
|||||||
async def to_code(self, w: Widget, config):
|
async def to_code(self, w: Widget, config):
|
||||||
if src := config.get(CONF_SRC):
|
if src := config.get(CONF_SRC):
|
||||||
lv.img_set_src(w.obj, await lv_image.process(src))
|
lv.img_set_src(w.obj, await lv_image.process(src))
|
||||||
if (cf_angle := config.get(CONF_ANGLE)) is not None:
|
if (pivot_x := config.get(CONF_PIVOT_X)) and (
|
||||||
pivot_x = config[CONF_PIVOT_X]
|
pivot_y := config.get(CONF_PIVOT_Y)
|
||||||
pivot_y = config[CONF_PIVOT_Y]
|
):
|
||||||
lv.img_set_pivot(w.obj, pivot_x, pivot_y)
|
lv.img_set_pivot(w.obj, pivot_x, pivot_y)
|
||||||
|
if (cf_angle := config.get(CONF_ANGLE)) is not None:
|
||||||
lv.img_set_angle(w.obj, cf_angle)
|
lv.img_set_angle(w.obj, cf_angle)
|
||||||
if (img_zoom := config.get(CONF_ZOOM)) is not None:
|
if (img_zoom := config.get(CONF_ZOOM)) is not None:
|
||||||
lv.img_set_zoom(w.obj, img_zoom)
|
lv.img_set_zoom(w.obj, img_zoom)
|
||||||
|
@@ -1085,6 +1085,7 @@ UNIT_KILOWATT = "kW"
|
|||||||
UNIT_KILOWATT_HOURS = "kWh"
|
UNIT_KILOWATT_HOURS = "kWh"
|
||||||
UNIT_LITRE = "L"
|
UNIT_LITRE = "L"
|
||||||
UNIT_LUX = "lx"
|
UNIT_LUX = "lx"
|
||||||
|
UNIT_MEGAJOULE = "MJ"
|
||||||
UNIT_METER = "m"
|
UNIT_METER = "m"
|
||||||
UNIT_METER_PER_SECOND_SQUARED = "m/s²"
|
UNIT_METER_PER_SECOND_SQUARED = "m/s²"
|
||||||
UNIT_MICROAMP = "µA"
|
UNIT_MICROAMP = "µA"
|
||||||
|
Reference in New Issue
Block a user