mirror of
https://github.com/esphome/esphome.git
synced 2024-11-25 08:28:12 +01:00
[lvgl] Enhancements (#7453)
This commit is contained in:
parent
ddde64a48d
commit
6d24e9ebb5
5 changed files with 246 additions and 7 deletions
|
@ -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:
|
Loading…
Reference in a new issue