Merge remote-tracking branch 'upstream/dev' into integration

This commit is contained in:
J. Nick Koston
2026-04-01 17:42:13 -10:00
17 changed files with 343 additions and 20 deletions
+1
View File
@@ -331,6 +331,7 @@ esphome/components/mipi_dsi/* @clydebarrow
esphome/components/mipi_rgb/* @clydebarrow
esphome/components/mipi_spi/* @clydebarrow
esphome/components/mitsubishi/* @RubyBailey
esphome/components/mitsubishi_cn105/* @crnjan
esphome/components/mixer/speaker/* @kahrendt
esphome/components/mlx90393/* @functionpointer
esphome/components/mlx90614/* @jesserockz
+17 -5
View File
@@ -380,8 +380,10 @@ async def to_code(configs):
# This must be done after all widgets are created
for comp in helpers.lvgl_components_required:
cg.add_define(f"USE_LVGL_{comp.upper()}")
# Currently always need RGB565 for the display buffer, and ARGB8888 is used for layer blending
lv_image_formats = {"RGB565", "ARGB8888"}
for use in helpers.lv_uses:
df.add_define(f"LV_USE_{use.upper()}")
cg.add_define(f"USE_LVGL_{use.upper()}")
if {
"transform_rotation",
"transform_scale",
@@ -389,9 +391,18 @@ async def to_code(configs):
"transform_scale_y",
} & styles_used:
df.add_define("LV_COLOR_SCREEN_TRANSP", "1")
for use in helpers.lv_uses:
df.add_define(f"LV_USE_{use.upper()}")
cg.add_define(f"USE_LVGL_{use.upper()}")
# Currently always need RGB565 for the display buffer, and ARGB8888 is used for layer blending
lv_image_formats = {"RGB565", "ARGB8888"}
if {
"drop_shadow_color",
"drop_shadow_offset_x",
"drop_shadow_offset_y",
"drop_shadow_opa",
"drop_shadow_quality",
"drop_shadow_radius",
} & styles_used:
lv_image_formats.add("A8")
for image_id in lv_images_used:
await cg.get_variable(image_id)
@@ -410,6 +421,7 @@ async def to_code(configs):
lv_image_formats.add("RGB888")
for fmt in lv_image_formats:
df.add_define(f"LV_DRAW_SW_SUPPORT_{fmt}", "1")
lv_conf_h_file = CORE.relative_src_path(LV_CONF_FILENAME)
write_file_if_changed(lv_conf_h_file, generate_lv_conf_h())
cg.add_build_flag("-DLV_CONF_H=1")
+64 -11
View File
@@ -251,22 +251,75 @@ LV_FONTS = list(f"montserrat_{s}" for s in range(8, 50, 2)) + [
]
LV_EVENT_MAP = {
"PRESS": "PRESSED",
"SHORT_CLICK": "SHORT_CLICKED",
"ALL_EVENTS": "ALL",
"CANCEL": "CANCEL",
"CHANGE": "VALUE_CHANGED",
"CHILD_CHANGE": "CHILD_CHANGED",
"CHILD_CREATE": "CHILD_CREATED",
"CHILD_DELETE": "CHILD_DELETED",
"CLICK": "CLICKED",
"COLOR_FORMAT_CHANGE": "COLOR_FORMAT_CHANGED",
"COVER_CHECK": "COVER_CHECK",
"CREATE": "CREATE",
"DEFOCUS": "DEFOCUSED",
"DELETE": "DELETE",
"DOUBLE_CLICK": "DOUBLE_CLICKED",
"DRAW_MAIN": "DRAW_MAIN",
"DRAW_MAIN_BEGIN": "DRAW_MAIN_BEGIN",
"DRAW_MAIN_END": "DRAW_MAIN_END",
"DRAW_POST": "DRAW_POST",
"DRAW_POST_BEGIN": "DRAW_POST_BEGIN",
"DRAW_POST_END": "DRAW_POST_END",
"DRAW_TASK_ADD": "DRAW_TASK_ADDED",
"FLUSH_FINISH": "FLUSH_FINISH",
"FLUSH_START": "FLUSH_START",
"FLUSH_WAIT_FINISH": "FLUSH_WAIT_FINISH",
"FLUSH_WAIT_START": "FLUSH_WAIT_START",
"FOCUS": "FOCUSED",
"GESTURE": "GESTURE",
"GET_SELF_SIZE": "GET_SELF_SIZE",
"HIT_TEST": "HIT_TEST",
"HOVER_LEAVE": "HOVER_LEAVE",
"HOVER_OVER": "HOVER_OVER",
"INDEV_RESET": "INDEV_RESET",
"INSERT": "INSERT",
"INVALIDATE_AREA": "INVALIDATE_AREA",
"KEY": "KEY",
"LAYOUT_CHANGE": "LAYOUT_CHANGED",
"LEAVE": "LEAVE",
"LONG_PRESS": "LONG_PRESSED",
"LONG_PRESS_REPEAT": "LONG_PRESSED_REPEAT",
"CLICK": "CLICKED",
"PRESS": "PRESSED",
"PRESS_LOST": "PRESS_LOST",
"PRESSING": "PRESSING",
"READY": "READY",
"REFRESH": "REFRESH",
"REFR_EXT_DRAW_SIZE": "REFR_EXT_DRAW_SIZE",
"REFR_READY": "REFR_READY",
"REFR_REQUEST": "REFR_REQUEST",
"REFR_START": "REFR_START",
"RELEASE": "RELEASED",
"RENDER_READY": "RENDER_READY",
"RENDER_START": "RENDER_START",
"RESOLUTION_CHANGE": "RESOLUTION_CHANGED",
"ROTARY": "ROTARY",
"SCREEN_LOAD": "SCREEN_LOADED",
"SCREEN_LOAD_START": "SCREEN_LOAD_START",
"SCREEN_UNLOAD": "SCREEN_UNLOADED",
"SCREEN_UNLOAD_START": "SCREEN_UNLOAD_START",
"SCROLL": "SCROLL",
"SCROLL_BEGIN": "SCROLL_BEGIN",
"SCROLL_END": "SCROLL_END",
"SCROLL": "SCROLL",
"FOCUS": "FOCUSED",
"DEFOCUS": "DEFOCUSED",
"READY": "READY",
"CANCEL": "CANCEL",
"ALL_EVENTS": "ALL",
"CHANGE": "VALUE_CHANGED",
"GESTURE": "GESTURE",
"SCROLL_THROW_BEGIN": "SCROLL_THROW_BEGIN",
"SHORT_CLICK": "SHORT_CLICKED",
"SINGLE_CLICK": "SINGLE_CLICKED",
"SIZE_CHANGE": "SIZE_CHANGED",
"STATE_CHANGE": "STATE_CHANGED",
"STYLE_CHANGE": "STYLE_CHANGED",
"TRIPLE_CLICK": "TRIPLE_CLICKED",
"UPDATE_LAYOUT_COMPLETE": "UPDATE_LAYOUT_COMPLETED",
"VSYNC": "VSYNC",
"VSYNC_REQUEST": "VSYNC_REQUEST",
}
LV_EVENT_TRIGGERS = tuple(f"on_{x.lower()}" for x in LV_EVENT_MAP)
+5 -3
View File
@@ -74,11 +74,13 @@ inline void lv_style_set_text_font(lv_style_t *style, const font::Font *font) {
#if defined(USE_LVGL_IMAGE) && defined(USE_IMAGE)
// Shortcut / overload, so that the source of an image can easily be updated
// from within a lambda.
inline void lv_image_set_src(lv_obj_t *obj, esphome::image::Image *image) {
lv_image_set_src(obj, image->get_lv_image_dsc());
inline void lv_image_set_src(lv_obj_t *obj, image::Image *image) { lv_image_set_src(obj, image->get_lv_image_dsc()); }
inline void lv_obj_set_style_bitmap_mask_src(lv_obj_t *obj, image::Image *image, lv_style_selector_t selector) {
lv_obj_set_style_bitmap_mask_src(obj, image->get_lv_image_dsc(), selector);
}
inline void lv_obj_set_style_bg_image_src(lv_obj_t *obj, esphome::image::Image *image, lv_style_selector_t selector) {
inline void lv_obj_set_style_bg_image_src(lv_obj_t *obj, image::Image *image, lv_style_selector_t selector) {
lv_obj_set_style_bg_image_src(obj, image->get_lv_image_dsc(), selector);
}
#endif // USE_LVGL_IMAGE
+1
View File
@@ -168,6 +168,7 @@ BASE_PROPS = {
"bg_main_opa": lvalid.opacity,
"bg_main_stop": lvalid.stop_value,
"bg_opa": lvalid.opacity,
"bitmap_mask_src": lvalid.lv_image,
"blend_mode": df.LvConstant(
"LV_BLEND_MODE_",
"NORMAL",
@@ -0,0 +1,41 @@
import esphome.codegen as cg
from esphome.components import climate, uart
import esphome.config_validation as cv
from esphome.const import CONF_UPDATE_INTERVAL
from esphome.types import ConfigType
DEPENDENCIES = ["uart"]
AUTO_LOAD = ["climate"]
CODEOWNERS = ["@crnjan"]
mitsubishi_ns = cg.esphome_ns.namespace("mitsubishi_cn105")
MitsubishiCN105Climate = mitsubishi_ns.class_(
"MitsubishiCN105Climate",
climate.Climate,
cg.Component,
uart.UARTDevice,
)
CONFIG_SCHEMA = (
climate.climate_schema(MitsubishiCN105Climate)
.extend(uart.UART_DEVICE_SCHEMA)
.extend({cv.Optional(CONF_UPDATE_INTERVAL, default="1s"): cv.update_interval})
)
FINAL_VALIDATE_SCHEMA = cv.All(
uart.final_validate_device_schema(
"mitsubishi_cn105",
require_rx=True,
require_tx=True,
data_bits=8,
parity="EVEN",
stop_bits=1,
)
)
async def to_code(config: ConfigType) -> None:
var = await climate.new_climate(config)
await cg.register_component(var, config)
await uart.register_uart_device(var, config)
@@ -0,0 +1,7 @@
#include "mitsubishi_cn105.h"
namespace esphome::mitsubishi_cn105 {
static const char *const TAG = "mitsubishi_cn105.driver";
} // namespace esphome::mitsubishi_cn105
@@ -0,0 +1,19 @@
#pragma once
#include "esphome/components/uart/uart.h"
namespace esphome::mitsubishi_cn105 {
class MitsubishiCN105 {
public:
explicit MitsubishiCN105(uart::UARTDevice &device) : device_(device) {}
uint32_t get_update_interval() const { return this->update_interval_ms_; }
void set_update_interval(uint32_t interval_ms) { this->update_interval_ms_ = interval_ms; }
protected:
uart::UARTDevice &device_;
uint32_t update_interval_ms_{1000};
};
} // namespace esphome::mitsubishi_cn105
@@ -0,0 +1,28 @@
#include "mitsubishi_cn105_climate.h"
#include "esphome/core/log.h"
namespace esphome::mitsubishi_cn105 {
static const char *const TAG = "mitsubishi_cn105.climate";
void MitsubishiCN105Climate::dump_config() {
LOG_CLIMATE("", "Mitsubishi CN105 Climate", this);
ESP_LOGCONFIG(TAG,
" Update interval: %" PRIu32 " ms\n"
" UART: baud_rate=%" PRIu32 " data_bits=%u parity=%s stop_bits=%u",
this->hp_.get_update_interval(), this->parent_->get_baud_rate(), this->parent_->get_data_bits(),
LOG_STR_ARG(parity_to_str(this->parent_->get_parity())), this->parent_->get_stop_bits());
}
void MitsubishiCN105Climate::setup() {}
void MitsubishiCN105Climate::loop() {}
climate::ClimateTraits MitsubishiCN105Climate::traits() {
climate::ClimateTraits traits;
return traits;
}
void MitsubishiCN105Climate::control(const climate::ClimateCall &call) {}
} // namespace esphome::mitsubishi_cn105
@@ -0,0 +1,27 @@
#pragma once
#include "esphome/core/component.h"
#include "esphome/components/climate/climate.h"
#include "esphome/components/uart/uart.h"
#include "mitsubishi_cn105.h"
namespace esphome::mitsubishi_cn105 {
class MitsubishiCN105Climate : public climate::Climate, public Component, public uart::UARTDevice {
public:
explicit MitsubishiCN105Climate() : hp_(*this) {}
void setup() override;
void loop() override;
void dump_config() override;
climate::ClimateTraits traits() override;
void control(const climate::ClimateCall &call) override;
void set_update_interval(uint32_t ms) { hp_.set_update_interval(ms); }
protected:
MitsubishiCN105 hp_;
};
} // namespace esphome::mitsubishi_cn105
+1 -1
View File
@@ -18,7 +18,7 @@ puremagic==1.30
ruamel.yaml==0.19.1 # dashboard_import
ruamel.yaml.clib==0.2.15 # dashboard_import
esphome-glyphsets==0.2.0
pillow==12.1.1
pillow==12.2.0
resvg-py==0.2.6
freetype-py==2.5.1
jinja2==3.1.6
+116
View File
@@ -511,6 +511,7 @@ lvgl:
image:
src: cat_image
align: top_left
bitmap_mask_src: alert
on_click:
- lvgl.widget.focus: spin_up
- lvgl.widget.focus: next
@@ -589,6 +590,114 @@ lvgl:
logger.log: Button clicked
on_long_press_repeat:
logger.log: Button clicked
on_pressing:
logger.log: Button pressing
on_press_lost:
logger.log: Button press lost
on_single_click:
logger.log: Button single clicked
on_double_click:
logger.log: Button double clicked
on_triple_click:
logger.log: Button triple clicked
on_scroll_throw_begin:
logger.log: Scroll throw begin
on_gesture:
logger.log: Gesture detected
on_key:
logger.log: Key event
on_rotary:
logger.log: Rotary event
on_leave:
logger.log: Leave event
on_hit_test:
logger.log: Hit test
on_indev_reset:
logger.log: Indev reset
on_hover_over:
logger.log: Hover over
on_hover_leave:
logger.log: Hover leave
on_cover_check:
logger.log: Cover check
on_refr_ext_draw_size:
logger.log: Refr ext draw size
on_draw_main_begin:
logger.log: Draw main begin
on_draw_main:
logger.log: Draw main
on_draw_main_end:
logger.log: Draw main end
on_draw_post_begin:
logger.log: Draw post begin
on_draw_post:
logger.log: Draw post
on_draw_post_end:
logger.log: Draw post end
on_draw_task_add:
logger.log: Draw task add
on_insert:
logger.log: Insert event
on_refresh:
logger.log: Refresh event
on_state_change:
logger.log: State changed
on_create:
logger.log: Create event
on_delete:
logger.log: Delete event
on_child_change:
logger.log: Child changed
on_child_create:
logger.log: Child created
on_child_delete:
logger.log: Child deleted
on_screen_unload_start:
logger.log: Screen unload start
on_screen_load_start:
logger.log: Screen load start
on_screen_load:
logger.log: Screen loaded
on_screen_unload:
logger.log: Screen unloaded
on_size_change:
logger.log: Size changed
on_style_change:
logger.log: Style changed
on_layout_change:
logger.log: Layout changed
on_get_self_size:
logger.log: Get self size
on_invalidate_area:
logger.log: Invalidate area
on_resolution_change:
logger.log: Resolution changed
on_color_format_change:
logger.log: Color format changed
on_refr_request:
logger.log: Refresh request
on_refr_start:
logger.log: Refresh start
on_refr_ready:
logger.log: Refresh ready
on_render_start:
logger.log: Render start
on_render_ready:
logger.log: Render ready
on_flush_start:
logger.log: Flush start
on_flush_finish:
logger.log: Flush finish
on_flush_wait_start:
logger.log: Flush wait start
on_flush_wait_finish:
logger.log: Flush wait finish
on_update_layout_complete:
logger.log: Update layout complete
on_vsync:
logger.log: Vsync
on_vsync_request:
logger.log: Vsync request
- led:
id: lv_led
color: 0x00FF00
@@ -1189,6 +1298,13 @@ image:
type: BINARY
transparency: chroma_key
- id: alert
file: $component_dir/logo-text.svg
type: grayscale
resize: 100x100
invert_alpha: true
transparency: alpha_channel
color:
- id: light_blue
hex: "3340FF"
@@ -0,0 +1,4 @@
climate:
- platform: mitsubishi_cn105
name: "AC Test"
uart_id: uart_bus
@@ -0,0 +1,4 @@
packages:
uart: !include ../../test_build_components/common/uart_9600_even/esp32-idf.yaml
<<: !include common.yaml
@@ -0,0 +1,4 @@
packages:
uart: !include ../../test_build_components/common/uart_9600_even/esp8266-ard.yaml
<<: !include common.yaml
@@ -0,0 +1,4 @@
packages:
uart: !include ../../test_build_components/common/uart_9600_even/rp2040-ard.yaml
<<: !include common.yaml