mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	[lvgl] Enhancements (#7453)
This commit is contained in:
		| @@ -22,9 +22,10 @@ from esphome.helpers import write_file_if_changed | |||||||
|  |  | ||||||
| from . import defines as df, helpers, lv_validation as lvalid | from . import defines as df, helpers, lv_validation as lvalid | ||||||
| from .automation import disp_update, focused_widgets, update_to_code | from .automation import disp_update, focused_widgets, update_to_code | ||||||
| from .defines import add_define | from .defines import CONF_WIDGETS, add_define | ||||||
| from .encoders import ENCODERS_CONFIG, encoders_to_code, initial_focus_to_code | from .encoders import ENCODERS_CONFIG, encoders_to_code, initial_focus_to_code | ||||||
| from .gradient import GRADIENT_SCHEMA, gradients_to_code | from .gradient import GRADIENT_SCHEMA, gradients_to_code | ||||||
|  | from .hello_world import get_hello_world | ||||||
| from .lv_validation import lv_bool, lv_images_used | from .lv_validation import lv_bool, lv_images_used | ||||||
| from .lvcode import LvContext, LvglComponent | from .lvcode import LvContext, LvglComponent | ||||||
| from .schemas import ( | from .schemas import ( | ||||||
| @@ -32,7 +33,7 @@ from .schemas import ( | |||||||
|     FLEX_OBJ_SCHEMA, |     FLEX_OBJ_SCHEMA, | ||||||
|     GRID_CELL_SCHEMA, |     GRID_CELL_SCHEMA, | ||||||
|     LAYOUT_SCHEMAS, |     LAYOUT_SCHEMAS, | ||||||
|     STYLE_SCHEMA, |     STATE_SCHEMA, | ||||||
|     WIDGET_TYPES, |     WIDGET_TYPES, | ||||||
|     any_widget_schema, |     any_widget_schema, | ||||||
|     container_schema, |     container_schema, | ||||||
| @@ -292,6 +293,13 @@ def display_schema(config): | |||||||
|     return value or [cv.use_id(Display)(config)] |     return value or [cv.use_id(Display)(config)] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def add_hello_world(config): | ||||||
|  |     if CONF_WIDGETS not in config and CONF_PAGES not in config: | ||||||
|  |         LOGGER.info("No pages or widgets configured, creating default hello_world page") | ||||||
|  |         config[CONF_WIDGETS] = cv.ensure_list(WIDGET_SCHEMA)(get_hello_world()) | ||||||
|  |     return config | ||||||
|  |  | ||||||
|  |  | ||||||
| FINAL_VALIDATE_SCHEMA = final_validation | FINAL_VALIDATE_SCHEMA = final_validation | ||||||
|  |  | ||||||
| CONFIG_SCHEMA = ( | CONFIG_SCHEMA = ( | ||||||
| @@ -313,7 +321,7 @@ CONFIG_SCHEMA = ( | |||||||
|             ), |             ), | ||||||
|             cv.Optional(df.CONF_STYLE_DEFINITIONS): cv.ensure_list( |             cv.Optional(df.CONF_STYLE_DEFINITIONS): cv.ensure_list( | ||||||
|                 cv.Schema({cv.Required(CONF_ID): cv.declare_id(lv_style_t)}) |                 cv.Schema({cv.Required(CONF_ID): cv.declare_id(lv_style_t)}) | ||||||
|                 .extend(STYLE_SCHEMA) |                 .extend(STATE_SCHEMA) | ||||||
|                 .extend( |                 .extend( | ||||||
|                     { |                     { | ||||||
|                         cv.Optional(df.CONF_GRID_CELL_X_ALIGN): grid_alignments, |                         cv.Optional(df.CONF_GRID_CELL_X_ALIGN): grid_alignments, | ||||||
| @@ -349,4 +357,5 @@ CONFIG_SCHEMA = ( | |||||||
|         } |         } | ||||||
|     ) |     ) | ||||||
|     .extend(DISP_BG_SCHEMA) |     .extend(DISP_BG_SCHEMA) | ||||||
| ).add_extra(cv.has_at_least_one_key(CONF_PAGES, df.CONF_WIDGETS)) |     .add_extra(add_hello_world) | ||||||
|  | ) | ||||||
|   | |||||||
							
								
								
									
										64
									
								
								esphome/components/lvgl/hello_world.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								esphome/components/lvgl/hello_world.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | |||||||
|  | from io import StringIO | ||||||
|  |  | ||||||
|  | from esphome.yaml_util import parse_yaml | ||||||
|  |  | ||||||
|  | CONFIG = """ | ||||||
|  | - obj: | ||||||
|  |     radius: 0 | ||||||
|  |     pad_all: 12 | ||||||
|  |     bg_color: 0xFFFFFF | ||||||
|  |     height: 100% | ||||||
|  |     width: 100% | ||||||
|  |     widgets: | ||||||
|  |     - spinner: | ||||||
|  |         id: hello_world_spinner_ | ||||||
|  |         align: center | ||||||
|  |         indicator: | ||||||
|  |           arc_color: tomato | ||||||
|  |         height: 100 | ||||||
|  |         width: 100 | ||||||
|  |         spin_time: 2s | ||||||
|  |         arc_length: 60deg | ||||||
|  |     - label: | ||||||
|  |         id: hello_world_label_ | ||||||
|  |         text: "Hello World!" | ||||||
|  |         align: center | ||||||
|  |         on_click: | ||||||
|  |             lvgl.spinner.update: | ||||||
|  |               id: hello_world_spinner_ | ||||||
|  |               arc_color: springgreen | ||||||
|  |     - checkbox: | ||||||
|  |         pad_all: 8 | ||||||
|  |         text: Checkbox | ||||||
|  |         align: top_right | ||||||
|  |         on_click: | ||||||
|  |           lvgl.label.update: | ||||||
|  |             id: hello_world_label_ | ||||||
|  |             text: "Checked!" | ||||||
|  |     - button: | ||||||
|  |         pad_all: 8 | ||||||
|  |         checkable: true | ||||||
|  |         align: top_left | ||||||
|  |         text_font: montserrat_20 | ||||||
|  |         on_click: | ||||||
|  |           lvgl.label.update: | ||||||
|  |             id: hello_world_label_ | ||||||
|  |             text: "Clicked!" | ||||||
|  |         widgets: | ||||||
|  |           - label: | ||||||
|  |               text: "Button" | ||||||
|  |     - slider: | ||||||
|  |         width: 80% | ||||||
|  |         align: bottom_mid | ||||||
|  |         on_value: | ||||||
|  |           lvgl.label.update: | ||||||
|  |             id: hello_world_label_ | ||||||
|  |             text: | ||||||
|  |               format: "%.0f%%" | ||||||
|  |               args: [x] | ||||||
|  | """ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_hello_world(): | ||||||
|  |     with StringIO(CONFIG) as fp: | ||||||
|  |         return parse_yaml("hello_world", fp) | ||||||
| @@ -49,17 +49,172 @@ def opacity_validator(value): | |||||||
|  |  | ||||||
| opacity = LValidator(opacity_validator, uint32, retmapper=literal) | opacity = LValidator(opacity_validator, uint32, retmapper=literal) | ||||||
|  |  | ||||||
|  | COLOR_NAMES = { | ||||||
|  |     "aliceblue": 0xF0F8FF, | ||||||
|  |     "antiquewhite": 0xFAEBD7, | ||||||
|  |     "aqua": 0x00FFFF, | ||||||
|  |     "aquamarine": 0x7FFFD4, | ||||||
|  |     "azure": 0xF0FFFF, | ||||||
|  |     "beige": 0xF5F5DC, | ||||||
|  |     "bisque": 0xFFE4C4, | ||||||
|  |     "black": 0x000000, | ||||||
|  |     "blanchedalmond": 0xFFEBCD, | ||||||
|  |     "blue": 0x0000FF, | ||||||
|  |     "blueviolet": 0x8A2BE2, | ||||||
|  |     "brown": 0xA52A2A, | ||||||
|  |     "burlywood": 0xDEB887, | ||||||
|  |     "cadetblue": 0x5F9EA0, | ||||||
|  |     "chartreuse": 0x7FFF00, | ||||||
|  |     "chocolate": 0xD2691E, | ||||||
|  |     "coral": 0xFF7F50, | ||||||
|  |     "cornflowerblue": 0x6495ED, | ||||||
|  |     "cornsilk": 0xFFF8DC, | ||||||
|  |     "crimson": 0xDC143C, | ||||||
|  |     "cyan": 0x00FFFF, | ||||||
|  |     "darkblue": 0x00008B, | ||||||
|  |     "darkcyan": 0x008B8B, | ||||||
|  |     "darkgoldenrod": 0xB8860B, | ||||||
|  |     "darkgray": 0xA9A9A9, | ||||||
|  |     "darkgreen": 0x006400, | ||||||
|  |     "darkgrey": 0xA9A9A9, | ||||||
|  |     "darkkhaki": 0xBDB76B, | ||||||
|  |     "darkmagenta": 0x8B008B, | ||||||
|  |     "darkolivegreen": 0x556B2F, | ||||||
|  |     "darkorange": 0xFF8C00, | ||||||
|  |     "darkorchid": 0x9932CC, | ||||||
|  |     "darkred": 0x8B0000, | ||||||
|  |     "darksalmon": 0xE9967A, | ||||||
|  |     "darkseagreen": 0x8FBC8F, | ||||||
|  |     "darkslateblue": 0x483D8B, | ||||||
|  |     "darkslategray": 0x2F4F4F, | ||||||
|  |     "darkslategrey": 0x2F4F4F, | ||||||
|  |     "darkturquoise": 0x00CED1, | ||||||
|  |     "darkviolet": 0x9400D3, | ||||||
|  |     "deeppink": 0xFF1493, | ||||||
|  |     "deepskyblue": 0x00BFFF, | ||||||
|  |     "dimgray": 0x696969, | ||||||
|  |     "dimgrey": 0x696969, | ||||||
|  |     "dodgerblue": 0x1E90FF, | ||||||
|  |     "firebrick": 0xB22222, | ||||||
|  |     "floralwhite": 0xFFFAF0, | ||||||
|  |     "forestgreen": 0x228B22, | ||||||
|  |     "fuchsia": 0xFF00FF, | ||||||
|  |     "gainsboro": 0xDCDCDC, | ||||||
|  |     "ghostwhite": 0xF8F8FF, | ||||||
|  |     "goldenrod": 0xDAA520, | ||||||
|  |     "gold": 0xFFD700, | ||||||
|  |     "gray": 0x808080, | ||||||
|  |     "green": 0x008000, | ||||||
|  |     "greenyellow": 0xADFF2F, | ||||||
|  |     "grey": 0x808080, | ||||||
|  |     "honeydew": 0xF0FFF0, | ||||||
|  |     "hotpink": 0xFF69B4, | ||||||
|  |     "indianred": 0xCD5C5C, | ||||||
|  |     "indigo": 0x4B0082, | ||||||
|  |     "ivory": 0xFFFFF0, | ||||||
|  |     "khaki": 0xF0E68C, | ||||||
|  |     "lavenderblush": 0xFFF0F5, | ||||||
|  |     "lavender": 0xE6E6FA, | ||||||
|  |     "lawngreen": 0x7CFC00, | ||||||
|  |     "lemonchiffon": 0xFFFACD, | ||||||
|  |     "lightblue": 0xADD8E6, | ||||||
|  |     "lightcoral": 0xF08080, | ||||||
|  |     "lightcyan": 0xE0FFFF, | ||||||
|  |     "lightgoldenrodyellow": 0xFAFAD2, | ||||||
|  |     "lightgray": 0xD3D3D3, | ||||||
|  |     "lightgreen": 0x90EE90, | ||||||
|  |     "lightgrey": 0xD3D3D3, | ||||||
|  |     "lightpink": 0xFFB6C1, | ||||||
|  |     "lightsalmon": 0xFFA07A, | ||||||
|  |     "lightseagreen": 0x20B2AA, | ||||||
|  |     "lightskyblue": 0x87CEFA, | ||||||
|  |     "lightslategray": 0x778899, | ||||||
|  |     "lightslategrey": 0x778899, | ||||||
|  |     "lightsteelblue": 0xB0C4DE, | ||||||
|  |     "lightyellow": 0xFFFFE0, | ||||||
|  |     "lime": 0x00FF00, | ||||||
|  |     "limegreen": 0x32CD32, | ||||||
|  |     "linen": 0xFAF0E6, | ||||||
|  |     "magenta": 0xFF00FF, | ||||||
|  |     "maroon": 0x800000, | ||||||
|  |     "mediumaquamarine": 0x66CDAA, | ||||||
|  |     "mediumblue": 0x0000CD, | ||||||
|  |     "mediumorchid": 0xBA55D3, | ||||||
|  |     "mediumpurple": 0x9370DB, | ||||||
|  |     "mediumseagreen": 0x3CB371, | ||||||
|  |     "mediumslateblue": 0x7B68EE, | ||||||
|  |     "mediumspringgreen": 0x00FA9A, | ||||||
|  |     "mediumturquoise": 0x48D1CC, | ||||||
|  |     "mediumvioletred": 0xC71585, | ||||||
|  |     "midnightblue": 0x191970, | ||||||
|  |     "mintcream": 0xF5FFFA, | ||||||
|  |     "mistyrose": 0xFFE4E1, | ||||||
|  |     "moccasin": 0xFFE4B5, | ||||||
|  |     "navajowhite": 0xFFDEAD, | ||||||
|  |     "navy": 0x000080, | ||||||
|  |     "oldlace": 0xFDF5E6, | ||||||
|  |     "olive": 0x808000, | ||||||
|  |     "olivedrab": 0x6B8E23, | ||||||
|  |     "orange": 0xFFA500, | ||||||
|  |     "orangered": 0xFF4500, | ||||||
|  |     "orchid": 0xDA70D6, | ||||||
|  |     "palegoldenrod": 0xEEE8AA, | ||||||
|  |     "palegreen": 0x98FB98, | ||||||
|  |     "paleturquoise": 0xAFEEEE, | ||||||
|  |     "palevioletred": 0xDB7093, | ||||||
|  |     "papayawhip": 0xFFEFD5, | ||||||
|  |     "peachpuff": 0xFFDAB9, | ||||||
|  |     "peru": 0xCD853F, | ||||||
|  |     "pink": 0xFFC0CB, | ||||||
|  |     "plum": 0xDDA0DD, | ||||||
|  |     "powderblue": 0xB0E0E6, | ||||||
|  |     "purple": 0x800080, | ||||||
|  |     "rebeccapurple": 0x663399, | ||||||
|  |     "red": 0xFF0000, | ||||||
|  |     "rosybrown": 0xBC8F8F, | ||||||
|  |     "royalblue": 0x4169E1, | ||||||
|  |     "saddlebrown": 0x8B4513, | ||||||
|  |     "salmon": 0xFA8072, | ||||||
|  |     "sandybrown": 0xF4A460, | ||||||
|  |     "seagreen": 0x2E8B57, | ||||||
|  |     "seashell": 0xFFF5EE, | ||||||
|  |     "sienna": 0xA0522D, | ||||||
|  |     "silver": 0xC0C0C0, | ||||||
|  |     "skyblue": 0x87CEEB, | ||||||
|  |     "slateblue": 0x6A5ACD, | ||||||
|  |     "slategray": 0x708090, | ||||||
|  |     "slategrey": 0x708090, | ||||||
|  |     "snow": 0xFFFAFA, | ||||||
|  |     "springgreen": 0x00FF7F, | ||||||
|  |     "steelblue": 0x4682B4, | ||||||
|  |     "tan": 0xD2B48C, | ||||||
|  |     "teal": 0x008080, | ||||||
|  |     "thistle": 0xD8BFD8, | ||||||
|  |     "tomato": 0xFF6347, | ||||||
|  |     "turquoise": 0x40E0D0, | ||||||
|  |     "violet": 0xEE82EE, | ||||||
|  |     "wheat": 0xF5DEB3, | ||||||
|  |     "white": 0xFFFFFF, | ||||||
|  |     "whitesmoke": 0xF5F5F5, | ||||||
|  |     "yellow": 0xFFFF00, | ||||||
|  |     "yellowgreen": 0x9ACD32, | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @schema_extractor("one_of") | @schema_extractor("one_of") | ||||||
| def color(value): | def color(value): | ||||||
|     if value == SCHEMA_EXTRACT: |     if value == SCHEMA_EXTRACT: | ||||||
|         return ["hex color value", "color ID"] |         return ["hex color value", "color ID"] | ||||||
|     return cv.Any(cv.int_, cv.use_id(ColorStruct))(value) |     return cv.Any(cv.int_, cv.one_of(*COLOR_NAMES, lower=True), cv.use_id(ColorStruct))( | ||||||
|  |         value | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |  | ||||||
| def color_retmapper(value): | def color_retmapper(value): | ||||||
|     if isinstance(value, cv.Lambda): |     if isinstance(value, cv.Lambda): | ||||||
|         return cv.returning_lambda(value) |         return cv.returning_lambda(value) | ||||||
|  |     if isinstance(value, str) and value in COLOR_NAMES: | ||||||
|  |         value = COLOR_NAMES[value] | ||||||
|     if isinstance(value, int): |     if isinstance(value, int): | ||||||
|         return literal( |         return literal( | ||||||
|             f"lv_color_make({(value >> 16) & 0xFF}, {(value >> 8) & 0xFF}, {value & 0xFF})" |             f"lv_color_make({(value >> 16) & 0xFF}, {(value >> 8) & 0xFF}, {value & 0xFF})" | ||||||
|   | |||||||
| @@ -38,8 +38,8 @@ lvgl: | |||||||
|       border_width: 0 |       border_width: 0 | ||||||
|       radius: 0 |       radius: 0 | ||||||
|       pad_all: 0 |       pad_all: 0 | ||||||
|       border_color: 0x0077b3 |       border_color: tomato | ||||||
|       text_color: 0xFFFFFF |       text_color: springgreen | ||||||
|       width: 100% |       width: 100% | ||||||
|       height: 30 |       height: 30 | ||||||
|       border_side: [left, top] |       border_side: [left, top] | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								tests/components/lvgl/test.host.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								tests/components/lvgl/test.host.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | display: | ||||||
|  |   - platform: sdl | ||||||
|  |     auto_clear_enabled: false | ||||||
|  |     dimensions: | ||||||
|  |       width: 480 | ||||||
|  |       height: 480 | ||||||
|  |  | ||||||
|  | touchscreen: | ||||||
|  |   - platform: sdl | ||||||
|  |  | ||||||
|  | lvgl: | ||||||
		Reference in New Issue
	
	Block a user