From db2fda75c33e04662622e996ebcfa5b580ba4f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Mon, 12 Aug 2024 00:39:48 +0200 Subject: [PATCH] Initial LVGL doc for ESPHome (#3678) Co-authored-by: Keith Burzinski Co-authored-by: clydebarrow <2366188+clydebarrow@users.noreply.github.com> Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- components/binary_sensor/lvgl.rst | 39 + components/display/index.rst | 25 +- components/font.rst | 4 +- components/index.rst | 1 + components/key_collector.rst | 18 +- components/light/lvgl.rst | 44 + components/lvgl/images/lvgl_align.png | Bin 0 -> 15911 bytes components/lvgl/images/lvgl_animimg.gif | Bin 0 -> 7025 bytes components/lvgl/images/lvgl_arc.png | Bin 0 -> 2738 bytes components/lvgl/images/lvgl_bar.png | Bin 0 -> 374 bytes components/lvgl/images/lvgl_baseobj.png | Bin 0 -> 730 bytes components/lvgl/images/lvgl_boxmodel.png | Bin 0 -> 9051 bytes components/lvgl/images/lvgl_button.png | Bin 0 -> 1062 bytes components/lvgl/images/lvgl_buttonmatrix.png | Bin 0 -> 2739 bytes components/lvgl/images/lvgl_checkbox.png | Bin 0 -> 1420 bytes components/lvgl/images/lvgl_dropdown.png | Bin 0 -> 2959 bytes components/lvgl/images/lvgl_image.png | Bin 0 -> 10371 bytes components/lvgl/images/lvgl_keyboard.png | Bin 0 -> 8996 bytes components/lvgl/images/lvgl_label.png | Bin 0 -> 1123 bytes components/lvgl/images/lvgl_led.png | Bin 0 -> 1123 bytes components/lvgl/images/lvgl_line.png | Bin 0 -> 1775 bytes .../lvgl/images/lvgl_main_screenshot.png | Bin 0 -> 134021 bytes components/lvgl/images/lvgl_meter.png | Bin 0 -> 7065 bytes components/lvgl/images/lvgl_msgbox.png | Bin 0 -> 4971 bytes components/lvgl/images/lvgl_roller.png | Bin 0 -> 2677 bytes components/lvgl/images/lvgl_slider.png | Bin 0 -> 521 bytes components/lvgl/images/lvgl_spinbox.png | Bin 0 -> 799 bytes components/lvgl/images/lvgl_spinner.gif | Bin 0 -> 36060 bytes components/lvgl/images/lvgl_switch.png | Bin 0 -> 737 bytes components/lvgl/images/lvgl_symbols.png | Bin 0 -> 30832 bytes components/lvgl/images/lvgl_tabview.png | Bin 0 -> 7993 bytes components/lvgl/images/lvgl_textarea.png | Bin 0 -> 4749 bytes components/lvgl/index.rst | 690 +++++++ components/lvgl/widgets.rst | 1788 +++++++++++++++++ components/number/lvgl.rst | 47 + components/select/lvgl.rst | 44 + components/sensor/lvgl.rst | 46 + components/switch/lvgl.rst | 42 + components/text/lvgl.rst | 43 + components/text_sensor/lvgl.rst | 44 + images/lvgl.png | Bin 0 -> 3401 bytes images/lvgl_c_bns.png | Bin 0 -> 1688 bytes images/lvgl_c_lig.png | Bin 0 -> 1658 bytes images/lvgl_c_num.png | Bin 0 -> 998 bytes images/lvgl_c_sel.png | Bin 0 -> 2622 bytes images/lvgl_c_swi.png | Bin 0 -> 1437 bytes images/lvgl_c_txt.png | Bin 0 -> 1623 bytes index.rst | 11 + 48 files changed, 2867 insertions(+), 19 deletions(-) create mode 100644 components/binary_sensor/lvgl.rst create mode 100644 components/light/lvgl.rst create mode 100644 components/lvgl/images/lvgl_align.png create mode 100644 components/lvgl/images/lvgl_animimg.gif create mode 100644 components/lvgl/images/lvgl_arc.png create mode 100644 components/lvgl/images/lvgl_bar.png create mode 100644 components/lvgl/images/lvgl_baseobj.png create mode 100644 components/lvgl/images/lvgl_boxmodel.png create mode 100644 components/lvgl/images/lvgl_button.png create mode 100644 components/lvgl/images/lvgl_buttonmatrix.png create mode 100644 components/lvgl/images/lvgl_checkbox.png create mode 100644 components/lvgl/images/lvgl_dropdown.png create mode 100644 components/lvgl/images/lvgl_image.png create mode 100644 components/lvgl/images/lvgl_keyboard.png create mode 100644 components/lvgl/images/lvgl_label.png create mode 100644 components/lvgl/images/lvgl_led.png create mode 100644 components/lvgl/images/lvgl_line.png create mode 100644 components/lvgl/images/lvgl_main_screenshot.png create mode 100644 components/lvgl/images/lvgl_meter.png create mode 100644 components/lvgl/images/lvgl_msgbox.png create mode 100644 components/lvgl/images/lvgl_roller.png create mode 100644 components/lvgl/images/lvgl_slider.png create mode 100644 components/lvgl/images/lvgl_spinbox.png create mode 100644 components/lvgl/images/lvgl_spinner.gif create mode 100644 components/lvgl/images/lvgl_switch.png create mode 100644 components/lvgl/images/lvgl_symbols.png create mode 100644 components/lvgl/images/lvgl_tabview.png create mode 100644 components/lvgl/images/lvgl_textarea.png create mode 100644 components/lvgl/index.rst create mode 100644 components/lvgl/widgets.rst create mode 100644 components/number/lvgl.rst create mode 100644 components/select/lvgl.rst create mode 100644 components/sensor/lvgl.rst create mode 100644 components/switch/lvgl.rst create mode 100644 components/text/lvgl.rst create mode 100644 components/text_sensor/lvgl.rst create mode 100644 images/lvgl.png create mode 100644 images/lvgl_c_bns.png create mode 100644 images/lvgl_c_lig.png create mode 100644 images/lvgl_c_num.png create mode 100644 images/lvgl_c_sel.png create mode 100644 images/lvgl_c_swi.png create mode 100644 images/lvgl_c_txt.png diff --git a/components/binary_sensor/lvgl.rst b/components/binary_sensor/lvgl.rst new file mode 100644 index 000000000..e56b9c196 --- /dev/null +++ b/components/binary_sensor/lvgl.rst @@ -0,0 +1,39 @@ +LVGL Binary Sensor +================== + +.. seo:: + :description: Instructions for setting up an LVGL widget binary sensor. + :image: ../images/lvgl_c_bns.png + +The ``lvgl`` binary sensor platform creates a binary sensor from an LVGL widget +and requires :doc:`LVGL ` to be configured. + +Supported widget is :ref:`lvgl-widget-button`. A single binary sensor supports only a single widget; in other words, it's not possible to have multiple widgets associated with a single ESPHome binary sensor component. + +Configuration variables: +------------------------ + +- **widget** (**Required**): The ID of a supported widget configured in LVGL, which will reflect the state of the binary sensor. +- All other variables from :ref:`Binary Sensor `. + +Example: + +.. code-block:: yaml + + binary_sensor: + - platform: lvgl + widget: btn_id + name: LVGL push button + +See Also +-------- +- :doc:`LVGL Main component ` +- :ref:`Button widget ` +- :doc:`/components/sensor/lvgl` +- :doc:`/components/number/lvgl` +- :doc:`/components/switch/lvgl` +- :doc:`/components/select/lvgl` +- :doc:`/components/light/lvgl` +- :doc:`/components/text/lvgl` +- :doc:`/components/text_sensor/lvgl` +- :ghedit:`Edit` diff --git a/components/display/index.rst b/components/display/index.rst index 7b4512f6f..5d5c02af1 100644 --- a/components/display/index.rst +++ b/components/display/index.rst @@ -8,14 +8,25 @@ Display Component The ``display`` component houses ESPHome's powerful rendering and display engine. Fundamentally, there are these types of displays: -- Text based displays like :doc:`7-Segment displays ` or +- Character displays like :doc:`7-Segment displays ` or :doc:`LCD displays `. -- Graphical serial displays like :doc:`nextion` that have their own processors for rendering. +- Serial displays like :doc:`nextion` that have their own processors for graphics rendering. - Graphical binary displays which can toggle ON/OFF any pixel, like :doc:`E-Paper `, + :doc:`OLED ` or :doc:`TFT ` displays. -For the last type, ESPHome has a powerful rendering engine that can do -many things like draw some basic shapes, print text with any font you want, or even show images. +For graphical displays, which offer the greatest flexibility, there are two options: + +- ESPHome's :ref:`own rendering engine ` +- :doc:`LVGL ` - Light and Versatile Graphics Library + +.. _display-engine: + +Display Rendering Engine +------------------------ + +ESPHome's own powerful rendering engine can handle many common tasks such as drawing basic shapes, +printing text with fonts of your choice, or even rendering images. To achieve all this flexibility displays tie in directly into ESPHome's :ref:`lambda system `. So when you want to write some text or sensor values to the screen you will be writing in C++ code @@ -24,11 +35,6 @@ using an API that is designed to - be simple and to be used without programming experience - but also be flexible enough to work with more complex tasks like displaying an analog clock. -.. _display-engine: - -Display Rendering Engine ------------------------- - In this section we will be discussing how to use ESPHome's display rendering engine from ESPHome and some basic commands. Please note that this only applies to displays that can control each pixel individually. @@ -605,6 +611,7 @@ See Also -------- - :apiref:`display/display_buffer.h` +- :doc:`LVGL ` - :ref:`Fonts ` - :ref:`Graph Component ` - :ref:`QR Code Component ` diff --git a/components/font.rst b/components/font.rst index 47ab89461..8f215822c 100644 --- a/components/font.rst +++ b/components/font.rst @@ -9,7 +9,7 @@ Font Renderer Component ESPHome's graphical rendering engine also has a powerful font drawer which integrates seamlessly into the system. You have the option to use **any** OpenType/TrueType (``.ttf``, ``.otf``, ``.woff``) font file at **any** size, as well as fixed-size `PCF `_ and `BDF `_ bitmap fonts. -These fonts can be used in ESPHome's :ref:`own rendering engine `. +These fonts can be used in ESPHome's :ref:`own rendering engine ` or in the :doc:`LVGL Graphics ` component. To use fonts you can either - Just grab a ``.ttf``, ``.otf``, ``.woff``, ``.pcf``, or ``.bdf`` file from somewhere on the internet and place it, for example, inside a ``fonts`` folder next to your configuration file. @@ -83,6 +83,7 @@ Next, create a ``font:`` section in your configuration: display: # ... + Configuration variables: ------------------------ @@ -155,6 +156,7 @@ See Also - :apiref:`display/display_buffer.h` - :ref:`display-engine` +- :doc:`/components/lvgl/index` - `MDI cheatsheet `_ - `MDI font repository `_ - :ghedit:`Edit` diff --git a/components/index.rst b/components/index.rst index f937b80a2..df4c68c25 100644 --- a/components/index.rst +++ b/components/index.rst @@ -26,6 +26,7 @@ Components touchscreen/index lock/index display_menu/index + lvgl/index media_player/index microphone/index speaker/index diff --git a/components/key_collector.rst b/components/key_collector.rst index 552522b5b..0976caf06 100644 --- a/components/key_collector.rst +++ b/components/key_collector.rst @@ -6,12 +6,12 @@ Key collector component .. seo:: :description: Key collector component -The ``key_collector`` component collects key presses from -components like :ref:`matrix_keypad` or ``wiegand``. It allows you to process -key sequences and treat them as one, for example to allow inputting of -a PIN code or a passkey. The component outputs the result of the keypress -sequence as a variable usable in automations. - +The ``key_collector`` component collects key presses from components +like :ref:`matrix_keypad`, :doc:`Wiegand keypad ` +or LVGL :ref:`Button Matrix `, :ref:`Keyboard ` +widgets. It allows you to process key sequences and treat them as one, for +example to allow inputting of a PIN code or a passkey. The component outputs +the result of the keypress sequence as a variable usable in automations. Component --------- @@ -92,7 +92,7 @@ See Also -------- - :doc:`/components/matrix_keypad` - -.. - :doc:`/components/wiegand` - +- :doc:`/components/wiegand` +- :ref:`LVGL Button Matrix widget ` +- :ref:`LVGL Keyboard widget ` - :ghedit:`Edit` diff --git a/components/light/lvgl.rst b/components/light/lvgl.rst new file mode 100644 index 000000000..a4e1d1d3b --- /dev/null +++ b/components/light/lvgl.rst @@ -0,0 +1,44 @@ +LVGL Light +========== + +.. seo:: + :description: Instructions for setting up an LVGL widget light. + :image: ../images/lvgl_c_lig.png + +The ``lvgl`` light platform creates a light from an LVGL widget +and requires :doc:`LVGL ` to be configured. + +Supported widget is :ref:`lvgl-widget-led`. A single light supports only a single widget; in other words, it's not possible to have multiple widgets associated with a single ESPHome light component. + +Configuration variables: +------------------------ + +- **widget** (**Required**): The ID of a ``led`` widget configured in LVGL, which will reflect the state of the light. +- All other options from :ref:`light `. + + +Example: + +.. code-block:: yaml + + light: + - platform: lvgl + widget: led_id + name: LVGL light + +.. note:: + + To have linear brightness control, ``gamma_correct`` of the light is set by default to ``0``. + +See Also +-------- +- :doc:`LVGL Main component ` +- :ref:`LED widget ` +- :doc:`/components/binary_sensor/lvgl` +- :doc:`/components/sensor/lvgl` +- :doc:`/components/number/lvgl` +- :doc:`/components/switch/lvgl` +- :doc:`/components/select/lvgl` +- :doc:`/components/text/lvgl` +- :doc:`/components/text_sensor/lvgl` +- :ghedit:`Edit` diff --git a/components/lvgl/images/lvgl_align.png b/components/lvgl/images/lvgl_align.png new file mode 100644 index 0000000000000000000000000000000000000000..e7a1381ca6e132dea3ac5302df356af8131d754e GIT binary patch literal 15911 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 literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_animimg.gif b/components/lvgl/images/lvgl_animimg.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f6bce8bee17d7b8d415e4436d93d16152327b82 GIT binary patch literal 7025 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

YrQaDu@zRonb)p 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 literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_baseobj.png b/components/lvgl/images/lvgl_baseobj.png new file mode 100644 index 0000000000000000000000000000000000000000..5fe7294ce66f7e61a72fe4a3f18a876e81800fc5 GIT binary patch literal 730 zcmeAS@N?(olHy`uVBq!ia0vp^`+&Hfg9%99TlD@m0|V1SPZ!6KinzBo4rV5}4? za@!BS)%knB-}_zF6u;_PRJLqf``07k`uu$-*KWOhJJa@5UeEDDiFa%z=5s6O{r`*7aVCdjI$H;`z&7zSa%D{qoMP$_)_&3@@WIpU+5 zKM5ZGUZ4JMN$}FcSA`CLE)nyyymO~J(OR~`%c^CGv&TpzGOXubyH(Y(cbE8KtGQ9x znoGa$lS3>D`cm2SI*miZiD-Fp1j06Yc6Xp?K!@2%BAyv z?|Jvl%~-1&eQwf`Q*Ks=4X!xrE}e7F@7uh)v!4I_Ql_=^inDCn*J;6Cl{;hfUT+NY z()?_5-_Pc2K=$3Z^ZJ*gUhl21`*PW&cJI?yc~(oOT)TBi_P2@LarWOw7ng{=-TU=k y?Yj5wYqwte^*3hECmY!tTMB*J=1<^TSnv2`%R|Sb!Iyw(mci52&t;ucLK6UZ)mUHv literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_boxmodel.png b/components/lvgl/images/lvgl_boxmodel.png new file mode 100644 index 0000000000000000000000000000000000000000..98251f41698f40b98077c1fdb5907c6e0a83eb10 GIT binary patch literal 9051 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 AumAu6 literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_button.png b/components/lvgl/images/lvgl_button.png new file mode 100644 index 0000000000000000000000000000000000000000..c80d07f2d16b54fcc0b841b1e9d703cec2db3ecf GIT binary patch literal 1062 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 Q4Wj@X%hRYTq|fz#16OP$v;Y7A literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_checkbox.png b/components/lvgl/images/lvgl_checkbox.png new file mode 100644 index 0000000000000000000000000000000000000000..31b63cc7f5eeecdcfb2f5b39df9a530a6e7496b1 GIT binary patch literal 1420 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 literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_keyboard.png b/components/lvgl/images/lvgl_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b009d310b9e2617b9205df246dae67333a710a GIT binary patch literal 8996 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 WlPM2Y`?diK4+c+HKbLh*2~7ZgofS|3 literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_led.png b/components/lvgl/images/lvgl_led.png new file mode 100644 index 0000000000000000000000000000000000000000..0349f1b9cde81373ffe8919880e8e8f01e2de1ab GIT binary patch literal 1123 zcmV-p1f2VcP)CEO5QWcMQj9tYQpm8y22vzl{{L@S*w-aRAc0-5ihxx-&?y4hVkB9Xof}{0F61OF#o^}je@DW%#r#x#F9q8|qwY6(EjZIwuE9^gCAp^Tysi)R7= zF+c$l0ifV#VeJL#QAjYAMq`pl`7zb1v#@rBY^EU*Cv8w0X$52iB4S-8tBrk3Uptgi z<3yYgBbhKo#0VzD$OcG6U@gSZMmQ^CKvt%-gXt7dZ%mAg6Q+nT=5_^51OOu}ArtFh zE&Tu{Az>}7!;bKs0sCx#I*B1XK=Z}AGS7S@U%U>#iqDNOXt6vd~{Oxgz8rg?oq z2$&{5zaWI{N~d?=E#fWmp8)UW_68)G1R$`7X#;3Zoi)uk^63$8v43YR60fiP73J<8 zg=WDdl2TeTZ2$o^bt2-9w@8Mqc9?jm?l0QqEV52dMpz#FH{hLANroaZ|#S64J1>Z z;Zx-E%dWgRp|{BA7fdAwnr&yXRd+yH+Ev%$7&W!~J_i&+Ha@RmW%XKW1w?{Lm%eOI z7&qTMTO`AnP09;>T93Q}LUAa&nh?JitX8`H&4c$e=z&UHk%(Aay)aN2Q_F-E)(kW! z7m2b%k!*K{@9G`%unkI^*Q=0e?WgK$or_5ApFb|97&d@Zen@zf#xM#E3EqbWHCRYE6l@|-2=-r)LsfxEVHdz0<)gVd0TboJ1dLqPsloP{6Y2RJ8p z_nZIFE{Vw9J)A3}72~(m&uL>!UJ$Jlk^_Z_x=23oNYN;QhkFbIych2=c(JY?9e3B% z>Zi3r>Io*-=U1|~$X8ukxhph(+~gdnlYdJaK*pGq5=7M1N~6w*$f;vcl}J7YIXBY` zLr!fGtg30%1`w8kL(3!vn(x04n+HWK4~m+F;(brE6)e>@5H^{N=66@brKbVfO@sYFsvc{8CIEABw|wqIQJn{*TAVdodsK=7 p;7kj-vNS77XZ4f{slH09W%Z?{pkPz002ovPDHLkV1ihd@-+Ye literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_line.png b/components/lvgl/images/lvgl_line.png new file mode 100644 index 0000000000000000000000000000000000000000..6d85c445b4d1abcd49c9ac4f5737c40c9a234036 GIT binary patch literal 1775 zcmZ8iX;_k36sD%d-AbE46Du}T)AZ981JhgpMay=le6&%-78lGECG07;C=ex58d1kW zZF0<9A|o|RLj}VLOVdnD#z_WqW!#9GZ~o4Y_nzn6d(ZZs^W4ik6pS}DvND1|Af`lu z?_p5tK%6jG39dnMVH79~69}OfArQ0n|FGh=gPAo1vZjpa>wT0a_)@$-W;5PWqJ(Y4 z9P(PT5zXIn)oL$#9l?TdZ^WK&xyIc!v24Vj$$i;qaN}@0l{~bE`ywJG*@94Mmltt~ zxc*VmuZY_QtDGM81vMTyvv~OZ=2^eAx%r-nraP(oMUN()y^GQJ4y7wqjb;#6)`dMA z(^h1^v5#)b-}HaPshq>hf^$4<#Fxvn{()wPdtA2NzqH2Y8~sm>;ou^-MK4)+VA8f} z2!3Trsu5efF&3w0v@8#5xF&6gA-Ga4SZrVieNeOQe&e5xt=zpW3rJ7RqE`^ZEvi;s z8wq%LD~Z;LQ^v*HPk-IpywpeYADnvgG|S6aYSI)PyP`RUsC!Qlm;^5n(3aFmyJ zexFu#aO;me*raZ8*tVgz3)d=ienkoYqn^^CZ!;Dzy2L7D>9~OvFzcc%qq*#$Pj~8~ z&wrr8n2*vnW_XWhRor|_<7*!e46F`nWMf{AuD0|WACt7rN~<)YrqT2SL)95Yf5h{g zNgiRLuww!{PcPe4U2+$y^c5e;t>gi4Gy`>GW&Io~$yWavH*DOT^h&E654OGdak03i zVP>Z~&=oqOHxJN!`IO$Qo3sc*n~flxg`p>l1!Vlhgoo3KxfFKVhca;LiA{fwfo)ilK==?$h?C(=5g+N8>dUyQ zswlNnIzAIk_URSeeba6cSkiJol?PblGSbeU;*sah>})MZJ()bOxm)iZ2_7P*bq!HD z$=QGuEenX7zn-8GX*1a{^O37?}r!85(CB&2y4Q@?X9wa zXp;MtTAURJD~x|2$j?hIh&?B1SM}3`PK^37RwlCkLOp3-0=#qIB{($1i z5jo-dZrO5?%S^*LEH|&^b)x?PR%oAw#jK1~t$(WhQV0eJ5^)_hbV<8KE6vw|(F$I% z3>9U;EDl0d>&vt+Kw_lz7xsZZBP0lW^=%%oAt`!b7lnk~%En_An(Y*1jI3@)51+Qu zngbQ~AD0`1aLFG^U1lQX%Qk2F(k|6>Oi3Qc)t*kTc*!WmA z@E=cg6Ys0;a=}*oF1eSj1(}7JY_7??=kt!m#QdxZA*MM{q@&$+gJ6wRYYtbjpd0$4 z){=5TU(xS{U{w~)GwTB5$4EBw^p4YR;0%{ovT{hE+24RT+u1tharr)# zu5&l5T;AsWlxPzfclF!y#jnmig7Pch%xbNCRxqs(`rZPcTH2o)CsU(e1STRl!m(@k z9Sdr9Hg)V>Y2gV2pI+Q~g;HgzvQtmZWK%7H;ZEcK;pTUU{{DopBA~1f{J|hZzhK{o I2O_Th3;G^#zyJUM literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_main_screenshot.png b/components/lvgl/images/lvgl_main_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c971a901e5a2623316069fdd7d6615ebd4520d GIT binary patch literal 134021 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 `-gHYpC9M8$NJbjIk>De*TFYhU9LE=axSr5) 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 literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_meter.png b/components/lvgl/images/lvgl_meter.png new file mode 100644 index 0000000000000000000000000000000000000000..1283126cccb54041511b0ec5e9084869e81a5eef GIT binary patch literal 7065 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 literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_msgbox.png b/components/lvgl/images/lvgl_msgbox.png new file mode 100644 index 0000000000000000000000000000000000000000..101a40c8b4f71430581d95d0cdfc91a562c905e3 GIT binary patch literal 4971 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 literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_roller.png b/components/lvgl/images/lvgl_roller.png new file mode 100644 index 0000000000000000000000000000000000000000..3eab1039c096540a7710312f2ba2b9f9dfc3b3a7 GIT binary patch literal 2677 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 literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_slider.png b/components/lvgl/images/lvgl_slider.png new file mode 100644 index 0000000000000000000000000000000000000000..d2de4030d2fc6ddbf12efd85046016cfbc97f645 GIT binary patch literal 521 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 H#$XKq@`m>x literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_switch.png b/components/lvgl/images/lvgl_switch.png new file mode 100644 index 0000000000000000000000000000000000000000..9864b2b79bb7768789c766ac5f2c10deb94eace9 GIT binary patch literal 737 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 literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_tabview.png b/components/lvgl/images/lvgl_tabview.png new file mode 100644 index 0000000000000000000000000000000000000000..ae18acf31a59a254690b250414f57bdadb3fc6b4 GIT binary patch literal 7993 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 literal 0 HcmV?d00001 diff --git a/components/lvgl/images/lvgl_textarea.png b/components/lvgl/images/lvgl_textarea.png new file mode 100644 index 0000000000000000000000000000000000000000..1382f7e10061ed79797ee3b8ef067dd5b6a9b662 GIT binary patch literal 4749 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 (Light and Versatile Graphics Library) is a free and open-source +embedded graphics library to create beautiful UIs for any MCU, MPU and display type. ESPHome supports `LVGL version 8 `__. + +.. figure:: /components/lvgl/images/lvgl_main_screenshot.png + +To use LVGL with a :ref:`display ` in ESPHome, you'll need an ESP32 or supported ESP32 variant. PSRAM is not a strict requirement but it is generally recommended, especially for color displays with resolutions larger than approximately 240x240 pixels. + +The graphic display should be configured with ``auto_clear_enabled: false`` and ``update_interval: never``, and should not have any ``lambda`` set. + +For interactivity, a :doc:`Touchscreen ` (capacitive highly preferred), a :doc:`/components/sensor/rotary_encoder` or a custom keypad made up from discrete :doc:`Binary Sensors ` can be used. + + +Basics +------ + +In LVGL, graphical elements like buttons, labels, sliders, etc. are called widgets or objects. See :doc:`/components/lvgl/widgets` for a complete list of widgets supported within ESPHome. Not all LVGL widgets are implemented, just those commonly used to support home automation needs/tasks. + +Every widget has a parent object where it is created. For example, if a label is created on a button, the button is the parent of the label. Complex widgets internally consist of several smaller/simpler widgets; these are known as parts, each of which can have separate properties from the main widget. + +Pages in ESPHome are implemented as LVGL screens, which are special objects which have no parent. There is always one active page on a display. + +Widgets can be assigned with an :ref:`config-id` so that they can be referenced in :ref:`automations `. + +Some widgets integrate also as native ESPHome components: + +.. list-table:: + :header-rows: 1 + :widths: 1 1 + + * - LVGL Widget + - ESPHome component + + * - ``button`` + - :doc:`Switch `, :doc:`Binary Sensor ` + + * - ``switch``, ``checkbox`` + - :doc:`Switch ` + + * - ``slider``, ``arc``, ``spinbox`` + - :doc:`Number `, :doc:`Sensor ` + + * - ``dropdown``, ``roller`` + - :doc:`Select ` + + * - ``label``, ``textarea`` + - :doc:`Text `, :doc:`Text Sensor ` + + * - ``led`` + - :doc:`Light ` + +These are useful with `Home Assistant automations `__ interacting directly with the widgets. + +Main Configuration +------------------ + +Although LVGL is a complex matrix of objects-parts-states-styles, ESPHome simplifies this into a hierarchy. + +At the highest level of the LVGL object hierarchy is the display (represented by the hardware driver). A display can have one or more pages associated with it. Each page contains a hierarchy of objects for graphical widgets representing a layout to be presented on the display. + +The following configuration variables apply to the main ``lvgl`` component, in order to establish the principal operating conditions. Some :ref:`styling options ` can be set at this level too, but only for inheritance purposes. + +**Configuration variables:** + +- **displays** (*Optional*, list, :ref:`config-id`): A list of display IDs where LVGL should perform rendering based on its configuration. This may be omitted if there is a single display configured, which will be used automatically. +- **touchscreens** (*Optional*, list): A list of touchscreens interacting with the LVGL widgets on the display. + - **touchscreen_id** (**Required**, :ref:`config-id`): ID of a touchscreen configuration related to a display. + - **long_press_time** (*Optional*, :ref:`Time `): For the touchscreen, delay after which the ``on_long_pressed`` :ref:`interaction trigger ` will be called. Defaults to ``400ms``. + - **long_press_repeat_time** (*Optional*, :ref:`Time `): For the touchscreen, repeated interval after ``long_press_time``, when ``on_long_pressed_repeat`` :ref:`interaction trigger ` will be called. Defaults to ``100ms``. +- **encoders** (*Optional*, list): A list of rotary encoders interacting with the LVGL widgets on the display. + - **group** (*Optional*, string): A name for a group of widgets which will interact with the the input device. See the :doc:`common properties ` of the widgets for more information on groups. + - **enter_button** (**Required**, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``ENTER`` key. + - **sensor** (*Optional*, :ref:`config-id`): The ID of a :doc:`/components/sensor/rotary_encoder`; or a list with buttons for left/right interaction with the widgets: + - **left_button** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``LEFT`` key. + - **right_button** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``RIGHT`` key. + - **long_press_time** (*Optional*, :ref:`Time `): For the rotary encoder, delay after which the ``on_long_pressed`` :ref:`interaction trigger ` will be called. Defaults to ``400ms``. Can be disabled with ``never``. + - **long_press_repeat_time** (*Optional*, :ref:`Time `): For the rotary encoder, repeated interval after ``long_press_time``, when ``on_long_pressed_repeat`` :ref:`interaction trigger ` will be called. Defaults to ``100ms``. Can be disabled with ``never``. +- **keypads** (*Optional*, list): A list of keypads interacting with the LVGL widgets on the display. + - **group** (*Optional*, string): A name for a group of widgets which will interact with the the input device. See the :doc:`common properties ` of the widgets for more information on groups. + - **up** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``UP`` key. + - **down** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``DOWN`` key. + - **right** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``RIGHT`` key. + - **left** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``LEFT`` key. + - **esc** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``ESC`` key. + - **del** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``DEL`` key. + - **backspace** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``BACKSPACE`` key. + - **enter** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``ENTER`` key. + - **next** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``NEXT`` key. + - **prev** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``PREV`` key. + - **home** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``HOME`` key. + - **end** (*Optional*, :ref:`config-id`): The ID of a :doc:`Binary Sensor `, to be used as ``END`` key. + - **long_press_time** (*Optional*, :ref:`Time `): For the keypad, delay after which the ``on_long_pressed`` :ref:`interaction trigger ` will be called. Defaults to ``400ms``. Can be disabled with ``never``. + - **long_press_repeat_time** (*Optional*, :ref:`Time `): For the keypad, repeated interval after ``long_press_time``, when ``on_long_pressed_repeat`` :ref:`interaction trigger ` will be called. Defaults to ``100ms``. Can be disabled with ``never``. + + .. tip:: + + When using binary sensors (from physical keys) to interact with LVGL, if there are only three keys available, they are best used when configured as a rotary encoder, where ``LEFT`` and ``RIGHT`` act like the rotary wheel, and ``ENTER`` generates an ``on_press`` :ref:`trigger `. With four or more keys, a keypad configuration is generally more appropriate. For example, a keypad consisting of five keys might use ``PREV``, ``NEXT``, ``UP``, ``DOWN`` and ``ENTER``; ``PREV``/``NEXT`` are used to select a widget within the group, ``UP``/``DOWN`` changes the selected value and ``ENTER`` generates an ``on_press`` :ref:`trigger `. + + The ``long_press_time`` and ``long_press_repeat_time`` can be fine-tuned also by setting them to ``never`` and using the ``autorepeat`` filter on each binary sensor separately. + +- **color_depth** (*Optional*, string): The color deph at which the contents are generated. Currently only ``16`` is supported (RGB565, 2 bytes/pixel), which is the default value. +- **buffer_size** (*Optional*, percentage): The percentage of screen size to allocate buffer memory. Default is ``100%`` (or ``1.0``). For devices without PSRAM, the recommended value is ``25%``. +- **log_level** (*Optional*, string): Set the logger level specifically for the messages of the LVGL library: ``TRACE``, ``INFO``, ``WARN``, ``ERROR``, ``USER``, ``NONE``. Defaults to ``WARN``. +- **byte_order** (*Optional*, int16): The byte order of the data LVGL outputs; either ``big_endian`` or ``little_endian``. Defaults to ``big_endian``. +- **disp_bg_color** (*Optional*, :ref:`color `): Solid color used to fill the background. Can be changed at runtime with the ``lvgl.update`` action. +- **disp_bg_image** (*Optional*, :ref:`image `): The ID of an existing image configuration, to be used as background wallpaper. To change the image at runtime use the ``lvgl.update`` action. Also see :ref:`lvgl-widget-image` for a note regarding supported image formats. +- **default_font** (*Optional*, ID): The ID of the :ref:`font ` used by default to render the text or symbols. Defaults to LVGL's internal ``montserrat_14`` if not specified. +- **style_definitions** (*Optional*, list): A batch of style definitions to use in LVGL widget's ``styles`` configuration. See :ref:`below ` for more details. +- **theme** (*Optional*, list): A list of styles to be applied to all widgets. See :ref:`below ` for more details. +- **widgets** (*Optional*, list): A list of :doc:`/components/lvgl/widgets` to be drawn on the root display. May not be used if ``pages`` (below) is configured. +- **pages** (*Optional*, list): A list of page IDs. Each page acts as a parent for widgets placed on it. May not be used with ``widgets`` (above). Options for each page: + - **skip** (*Optional*, boolean): Option to skip this page when navigating between them with :ref:`lvgl-page-next-previous-action`. + - **layout** (*Optional*): See :ref:`lvgl-layouts` for details. Defaults to ``NONE``. + - **widgets** (*Optional*, list): A list of :doc:`/components/lvgl/widgets` to be drawn on the page. + - All other options from :ref:`lvgl-styling` to be applied to this page. +- **page_wrap** (*Optional*, boolean): Wrap from the last to the first page when navigating between them with :ref:`lvgl-page-next-previous-action`. Defaults to ``true``. +- **top_layer** (*Optional*, list): A special kind of *Always on Top* page, which acts as a parent for widgets placed on it. It's shown above all the pages, which may be useful for widgets which always need to be visible. + - **layout** (*Optional*): See :ref:`lvgl-layouts` for details. Defaults to ``NONE``. + - **widgets** (*Optional*, list): A list of :doc:`/components/lvgl/widgets` to be drawn on the page. + - All other options from :ref:`lvgl-styling` to be applied to this page. +- **layout** (*Optional*): See :ref:`lvgl-layouts` for details. Defaults to ``NONE``. +- All other options from :ref:`lvgl-styling` to be applied to all widgets directly. + +**Example:** + +.. code-block:: yaml + + # Example configuration entry + lvgl: + displays: + - my_display + touchscreens: + - my_touch + pages: + - id: main_page + widgets: + - label: + align: CENTER + text: 'Hello World!' + + +.. _lvgl-color: + +Colors +****** + +Colors can be specified anywhere in the LVGL configuration either by referencing a preconfigured :ref:`ESPHome color ` ID or by representing the color in the common hexadecimal notation. For example, ``0xFF0000`` would be red. + +.. _lvgl-opacity: + +Opacity +******* + +Various parts of the widgets (like background, borders etc.) support opacity. It can be overridden with a string: ``TRANSP`` for fully transparent, ``COVER`` for fully opaque, or percentage between ``0%`` and ``100%``. Actual default values depend on widget specifics. + +.. _lvgl-fonts: + +Fonts +***** + +Two font choices are available: + +**ESPHome fonts** + +You can use :ref:`fonts configured normally`, the glyphs will be rendered while building the binary. This has the advantage that you can define custom sets of glyphs of any size, with icons or diacritic characters of your choice, for any language, from any TrueType/OpenType font, allowing a more optimal flash space usage because you don't need to include all glyphs for all sizes you wish to use. + +.. tip:: + + For best results, set ``bpp: 4`` to get the glyphs rendered with proper anti-aliasing. + + +**Library fonts** + +The LVGL library offers by default prerendered sets with ASCII characters (``0x20-0x7F``), the degree symbol (``0xB0``), the bullet symbol (``0x2022``) from `Montserrat Medium `__, and 60 symbols from `FontAwesome `__ (see below). You can use the IDs below when specifying the ``text_font`` parameter: + +- ``montserrat_8``: 8px font +- ``montserrat_10``: 10px font +- ``montserrat_12``: 12px font +- ``montserrat_14``: 14px font (**default**, included if ``default_font`` option is missing) +- ``montserrat_16``: 16px font +- ``montserrat_18``: 18px font +- ``montserrat_20``: 20px font +- ``montserrat_22``: 22px font +- ``montserrat_24``: 24px font +- ``montserrat_26``: 26px font +- ``montserrat_28``: 28px font +- ``montserrat_30``: 30px font +- ``montserrat_32``: 32px font +- ``montserrat_34``: 34px font +- ``montserrat_36``: 36px font +- ``montserrat_38``: 38px font +- ``montserrat_40``: 40px font +- ``montserrat_42``: 42px font +- ``montserrat_44``: 44px font +- ``montserrat_46``: 46px font +- ``montserrat_48``: 48px font + +The binary will only include any of the above if used in the configuration. + +You can display the embedded symbols among the text by their codepoint address preceded by ``\u``. For example: ``\uF00C``: + +.. figure:: /components/lvgl/images/lvgl_symbols.png + :align: center + +.. note:: + + The ``text_font`` parameter affects the size of symbols, since all the built-in font arrays based on Montserrat include these symbols at the respective sizes. If you set ``text_font`` on a widget to a custom ESPHome font, these symbols will likely not display, unless you include them manually from a FontAwesome OpenType file. + + For escape sequences to work, you have to put them in strings enclosed in double quotes. + +In addition to the above, the following special fonts are available from LVGL as built-in: + +- ``unscii_8``: 8 px pixel perfect font with only ASCII characters. +- ``unscii_16``: 16 px pixel perfect font with only ASCII characters. +- ``simsun_16_cjk``: 16 px font with normal range + 1000 most common `CJK Radicals `__. +- ``dejavu_16_persian_hebrew``: 16 px font with normal range + Hebrew, Arabic, Persian letters and all their forms. + +.. _lvgl-styling: + +Style properties +**************** + +LVGL follows CSS's `border-box model `__. A widget's *box* is built from the following parts: + +.. figure:: /components/lvgl/images/lvgl_boxmodel.png + :align: center + +- *bounding box*: the box defined with ``width`` and ``height`` of the widgets (pixels or parent content area percentage; not drawn, just for calculations). +- *border*: the border line, drawn on the inner side of the bounding box (pixels). +- *outline*: the outline, drawn on the outer side of the bounding box (pixels). +- *padding*: space to keep between the border of the widget and its content or children (*I don't want my children too close to my sides, so keep this space*). +- *content*: the content area which is the size of the bounding box reduced by the border width and padding (it's what's referenced as the ``SIZE_CONTENT`` option of certain widgets). + +You can adjust the appearance of widgets by changing their foreground, background, border color and/or font. Some widgets allow for more complex styling, effectively changing all or part of their appearance. + +**Styling variables:** + +- **bg_color** (*Optional*, :ref:`color `): Color for the background of the widget. Defaults to ``0xFFFFFF`` (white). +- **bg_grad_color** (*Optional*, :ref:`color `): Color to make the background gradually fade to. Defaults to ``0`` (black). +- **bg_dither_mode** (*Optional*, dict): Set dithering of the background gradient. One of ``NONE``, ``ORDERED``, ``ERR_DIFF``. Defaults to ``NONE``. +- **bg_grad_dir** (*Optional*, dict): Choose the direction of the background gradient: ``NONE``, ``HOR``, ``VER``. Defaults to ``NONE``. +- **bg_main_stop** (*Optional*, 0-255): Specify where the gradient should start: ``0`` = upper left, ``128`` = in the center, ``255`` = lower right. Defaults to ``0``. +- **bg_grad_stop** (*Optional*, 0-255): Specify where the gradient should stop: ``0`` = upper left, ``128`` = in the center, ``255`` = lower right. Defaults to ``255``. +- **opa** (*Optional*, :ref:`opacity `): Opacity of the entire widget. Inherited from parent. Defaults to ``COVER``. +- **bg_opa** (*Optional*, :ref:`opacity `): Opacity of the widget background. +- **opa_layered** (*Optional*, :ref:`opacity `): Opacity of the entire layer the widget is on. Inherited from parent. Defaults to ``COVER``. +- **bg_image_src** (*Optional*, :ref:`image `): The ID of an existing image configuration, to show as the background of the widget. +- **bg_image_opa** (*Optional*, :ref:`opacity `): Opacity of the background image of the widget. +- **bg_image_recolor** (*Optional*, :ref:`color `): Color to mix with every pixel of the background image of the widget. +- **bg_image_recolor_opa** (*Optional*, :ref:`opacity `): Opacity of the recoloring of the background image of the widget. +- **border_width** (*Optional*, int16): Set the width of the border in pixels. Defaults to ``0``. +- **border_color** (*Optional*, :ref:`color `): Color to draw borders of the widget. Defaults to ``0`` (black). +- **border_opa** (*Optional*, :ref:`opacity `): Opacity of the borders of the widget. Defaults to ``COVER``. +- **border_post** (*Optional*, boolean): If ``true`` the border will be drawn after all children of the widget have been drawn. Defaults to ``false``. +- **border_side** (*Optional*, list): Select which borders of the widgets to show (multiple can be specified as a YAML list, defaults to ``NONE``): + - ``NONE`` + - ``TOP`` + - ``BOTTOM`` + - ``LEFT`` + - ``RIGHT`` + - ``INTERNAL`` +- **radius** (*Optional*, uint16): The radius to be used to form the widget's rounded corners. 0 = no radius (square corners); 65535 = pill shaped widget (true circle if it has same width and height). +- **clip_corner** (*Optional*, boolean): If set to ``true``, overflowing content will be clipped off by the widget's rounded corners (``radius`` > ``0``). +- **outline_width** (*Optional*, int16): Set the width of the outline in pixels. Defaults to ``0``. +- **outline_color** (*Optional*, :ref:`color `): Color used to draw an outline around the widget. Defaults to ``0`` (black). +- **outline_opa** (*Optional*, :ref:`opacity `): Opacity of the outline of the widget. Defaults to ``COVER``. +- **outline_pad** (*Optional*, int16): Distance between the outline and the widget itself. Defaults to ``0``. +- **pad_all** (*Optional*, int16): Set the padding in all directions, in pixels. +- **pad_top** (*Optional*, int16): Set the padding on the top, in pixels. +- **pad_bottom** (*Optional*, int16): Set the padding on the bottom, in pixels. +- **pad_left** (*Optional*, int16): Set the padding on the left, in pixels. +- **pad_right** (*Optional*, int16): Set the padding on the right, in pixels. +- **pad_row** (*Optional*, int16): Set the padding between the rows of the children elements, in pixels. +- **pad_column** (*Optional*, int16): Set the padding between the columns of the children elements, in pixels. +- **shadow_color** (*Optional*, :ref:`color `): Color used to create a drop shadow under the widget. Defaults to ``0`` (black). +- **shadow_ofs_x** (*Optional*, int16): Horizontal offset of the shadow, in pixels. Defaults to ``0``. +- **shadow_ofs_y** (*Optional*, int16): Vertical offset of the shadow, in pixels. Defaults to ``0``. +- **shadow_opa** (*Optional*, :ref:`opacity `): Opacity of the shadow. Defaults to ``COVER``. +- **shadow_spread** (*Optional*, int16): Spread of the shadow, in pixels. Defaults to ``0``. +- **shadow_width** (*Optional*, int16): Width of the shadow, in pixels. Defaults to ``0``. +- **transform_angle** (*Optional*, 0-360): Transformation angle of the widget (eg. rotation) +- **transform_height** (*Optional*, int16 or percentage): Transformation height of the widget (eg. stretching) +- **transform_pivot_x** (*Optional*, int16): Horizontal anchor point of the transformation. Relative to the widget's top left corner. +- **transform_pivot_y** (*Optional*, int16): Vertical anchor point of the transformation. Relative to the widget's top left corner. +- **transform_zoom** (*Optional*, 0.1-10): Transformation zoom of the widget (eg. resizing) +- **translate_x** (*Optional*, int16 or percentage): Movement of the widget with this value in horizontal direction. +- **translate_y** (*Optional*, int16 or percentage): Movement of the widget with this value in vertical direction. + +.. _lvgl-theme: + +Themes +****** + +The widgets support lots of :ref:`lvgl-styling` to customize their appearance and behavior. + +You can configure a global theme for all widgets at the top level with the ``theme`` configuration variable. In the example below, all the ``arc``, ``slider`` and ``button`` widgets will, by default, use the styles and properties defined here. A combination of styles and :ref:`states ` can be chosen for every widget. + +.. code-block:: yaml + + lvgl: + theme: + arc: + scroll_on_focus: true + group: general + slider: + scroll_on_focus: true + group: general + button: + scroll_on_focus: true + group: general + border_width: 2 + outline_pad: 6 + pressed: + border_color: 0xFF0000 + checked: + border_color: 0xFFFF00 + focused: + border_color: 0x00FF00 + +Naturally, you can override these at the individual configuration level of each widget. This can be done in batches, using the ``style_definitions`` configuration variable of the main component. +In the example below, you defined ``date_style``: + +.. code-block:: yaml + + lvgl: + style_definitions: + - id: date_style # choose an ID for your definition + text_font: unscii_8 + align: center + text_color: 0x000000 + bg_opa: cover + radius: 4 + pad_all: 2 + +And then you apply these selected styles to two labels, and only change very specific style ``y`` locally: + +.. code-block:: yaml + + widgets: + - label: + id: day_label + styles: date_style # apply the definition here by the ID chosen above + y: -20 + - label: + id: date_label + styles: date_style + y: +20 + +Additionally, you can change the styles based on the :ref:`state ` property of the widgets or their parts. If you want to set a property for all states (e.g. red background color) just set it for the default state at the root of the widget. If the widget can't find a property for its current state it will fall back to this. + +In the example below, you have an ``arc`` with some styles set here. Note how you change the ``arc_color`` of the ``indicator`` part, based on state changes: + +.. code-block:: yaml + + - arc: + id: my_arc + value: 75 + min_value: 1 + max_value: 100 + indicator: + arc_color: 0xF000FF + pressed: + arc_color: 0xFFFF00 + focused: + arc_color: 0x808080 + +So the precedence happens like this: state based styles override the locally specified styles, which override the style definitions, which override the theme, which overrides the top level styles. The value precedence of states is quite intuitive and it's something the user would expect naturally. For example, if a widget is focused the user will still want to see if it's pressed, therefore the pressed state has a higher precedence. (If the focused state had a higher precedence it would override the *pressed* color, defeating its purpose.) + +Feel free to experiment to discover inheritance and precedence of the styles based on states between the nested widgets. + + +.. _lvgl-layouts: + +Layouts +******* + +Layouts aim to position widgets automatically, eliminating the need to specify ``x`` and ``y`` coordinates to position each widget. This is a great way to simplify your configuration as it allows you to omit alignment options. + +The layout configuration options are applied to any parent widget or page, influencing the appearance of the children. The position and size calculated by the layout overwrites the *normal* ``x``, ``y``, ``width``, and ``height`` settings of the children. + + +The ``hidden``, ``ignore_layout`` and ``floating`` :ref:`flags ` can be used on widgets to ignore them in layout calculations. + +**Configuration variables:** + +- **layout** (*Optional*, dict): A dictionary describing the layout configuration: + - **type** (*Optional*, string): ``FLEX``, ``GRID`` or ``NONE``. Defaults to ``NONE``. + - Further options from below depending on the chosen type. + +**Flex** + +The Flex layout in LVGL is a subset implementation of `CSS Flexbox `__. + +It can arrange items into rows or columns (tracks), handle wrapping, adjust spacing between items and tracks and even handle growing the layout to make the item(s) fill the remaining space with respect to minimum/maximum width and height. + +**Terms used:** + +- *track*: the rows or columns *main* direction flow: row or column in the direction in which the items are placed one after the other. +- *cross direction*: perpendicular to the main direction. +- *wrap*: if there is no more space in the track a new track is started. +- *gap*: the space between the rows and columns or the items on a track. +- *grow*: if set on an item it will grow to fill the remaining space on the track. The available space will be distributed among items respective to their grow value (larger value means more space). It dictates what amount of the available space the widget should take up. For example if all items on the track have a ``grow`` set to ``1``, the space in the track will be distributed equally to all of them. If one of the items has a value of 2, that one would take up twice as much of the space as either one of the others. + +**Configuration variables:** + + - **flex_flow** (*Optional*, string): Select the arrangement of the children widgets: + - ``ROW``: place the children in a row without wrapping. + - ``COLUMN``: place the children in a column without wrapping. + - ``ROW_WRAP``: place the children in a row with wrapping (default). + - ``COLUMN_WRAP``: place the children in a column with wrapping. + - ``ROW_REVERSE``: place the children in a row without wrapping but in reversed order. + - ``COLUMN_REVERSE``: place the children in a column without wrapping but in reversed order. + - ``ROW_WRAP_REVERSE``: place the children in a row with wrapping but in reversed order. + - ``COLUMN_WRAP_REVERSE``: place the children in a column with wrapping but in reversed order. + + - **flex_align_main** (*Optional*, string): Determines how to distribute the items in their track on the *main* axis. For example, flush the items to the right on with ``flex_flow: ROW_WRAP`` (known as *justify-content* in CSS). Possible options below. + - **flex_align_cross** (*Optional*, string): Determines how to distribute the items in their track on the *cross* axis. For example, if the items have different height place them to the bottom of the track (known as *align-items* in CSS). Possible options below. + - **flex_align_track** (*Optional*, string): Determines how to distribute the tracks (known as *align-content* in CSS). Possible options below. + + Values for use with ``flex_align_main``, ``flex_align_cross``, ``flex_align_track``: + + - ``START``: means left horizontally and top vertically (default). + - ``END``: means right horizontally and bottom vertically. + - ``CENTER``: simply center. + - ``SPACE_EVENLY``: items are distributed so that the spacing between any two items (and the space to the edges) is equal. Does not apply to ``flex_align_track``. + - ``SPACE_AROUND``: items are evenly distributed in the track with equal space around them. Note that visually the spaces aren’t equal, since all the items have equal space on both sides. The first item will have one unit of space against the container edge, but two units of space between the next item because that next item has its own spacing that applies. Does not apply to ``flex_align_track``. + - ``SPACE_BETWEEN``: items are evenly distributed in the track: first item is on the start line, last item on the end line. Does not apply to ``flex_align_track``. + + - **pad_row** (*Optional*, int16): Set the padding between the rows, in pixels. + - **pad_column** (*Optional*, int16): Set the padding between the columns, in pixels. + - **flex_grow** (*Optional*, int16): Flex grow can be used to make one or more children fill the available space on the track. When more children have grow parameters, the available space will be distributed proportionally to the grow values. Defaults to ``0``, which disables growing. + +**Grid** + +The Grid layout in LVGL is a subset implementation of `CSS Flexbox `__. + +It can arrange items into a 2D "table" that has rows or columns (tracks). The item(s) can span through multiple columns or rows. The track's size can be set in pixels, to the largest item of the track (``CONTENT``) or in "free units" to distribute the free space proportionally. + +**Terms used:** + +- *tracks*: the rows or the columns. +- *gap*: the space between the rows and columns or the items on a track. +- *free unit (FR)*: a proportional distribution unit for the space available on the track. It accepts a unitless integer value that serves as a proportion. It dictates what amount of the available space the widget should take up. For example if all items on the track have a ``FR`` set to ``1``, the space in the track will be distributed equally to all of them. If one of the items has a value of 2, that one would take up twice as much of the space as either one of the others. + +**Configuration variables:** + + - **grid_rows** (**Required**): The number of rows in the grid, expressed a list of values in pixels, ``CONTENT`` or ``FR(n)`` (free units, where ``n`` is a proportional integer value). + - **grid_columns** (**Required**): The number of columns in the grid, expressed a list of values in pixels, ``CONTENT`` or ``FR(n)`` (free units, where ``n`` is a proportional integer value). + - **grid_row_align** (*Optional*, string): How to align the row. Works only when ``grid_rows`` is given in pixels. Possible options below. + - **grid_column_align** (*Optional*, string): How to align the column. Works only when ``grid_columns`` is given in pixels. Possible options below. + - **pad_row** (*Optional*, int16): Set the padding between the rows, in pixels. + - **pad_column** (*Optional*, int16): Set the padding between the columns, in pixels. + +In a grid layout, *all the widgets placed on the grid* will get some additional configuration variables to help with placement: + + - **grid_cell_row_pos** (**Required**, int16): Position of the widget, in which row to appear (0 based count). + - **grid_cell_column_pos** (**Required**, int16): Position of the widget, in which column to appear (0 based count). + - **grid_cell_x_align** (*Optional*, string): How to align the widget horizontally within the cell. Can also be applied through :ref:`lvgl-styling`. Possible options below. + - **grid_cell_y_align** (*Optional*, string): How to align the widget vertically within the cell. Can also be applied through :ref:`lvgl-styling`. Possible options below. + - **grid_cell_row_span** (*Optional*, int16): How many rows to span across the widget. Defaults to ``1``. + - **grid_cell_column_span** (*Optional*, int16): How many columns to span across the widget. . Defaults to ``1``. + + .. note:: + + These ``grid_cell_`` variables apply to widget configuations! + +Values for use with ``grid_column_align``, ``grid_row_align``, ``grid_cell_x_align``, ``grid_cell_y_align``: + + - ``START``: means left horizontally and top vertically (default). + - ``END``: means right horizontally and bottom vertically. + - ``CENTER``: simply center. + - ``STRETCH``: stretch the widget to the cell in the respective direction. Does not apply to ``grid_column_align``, ``grid_row_align``. + - ``SPACE_EVENLY``: items are distributed so that the spacing between any two items (and the space to the edges) is equal. + - ``SPACE_AROUND``: items are evenly distributed in the track with equal space around them. Note that visually the spaces aren’t equal, since all the items have equal space on both sides. The first item will have one unit of space against the container edge, but two units of space between the next item because that next item has its own spacing that applies. + - ``SPACE_BETWEEN``: items are evenly distributed in the track: first item is on the start line, last item on the end line. + +.. tip:: + + To visualize real, calculated sizes of transparent widgets you can temporarily set ``outline_width: 1`` on them. + +Widgets +******* + +LVGL supports a list of :doc:`/components/lvgl/widgets` which can be used to draw interactive objects on the screen. + +Actions +------- + +Widgets support :ref:`general or specific ` actions. +Several actions are available for LVGL, these are outlined below. + +.. _lvgl-redraw-action: + +``lvgl.widget.redraw`` +********************** + +This :ref:`action ` redraws the entire screen, or optionally only a widget on it. + +- **id** (*Optional*): The ID of a widget configured in LVGL which you want to redraw; if omitted, the entire screen will be redrawn. + +.. code-block:: yaml + + on_...: + then: + - lvgl.widget.redraw: + +.. _lvgl-pause-action: + +``lvgl.pause`` +************** + +This :ref:`action ` pauses the activity of LVGL, including rendering. + +- **show_snow** (*Optional*, boolean): When paused, display random colored pixels across the entire screen in order to minimize screen burn-in, to relief the tension put on each individual pixel. + +.. code-block:: yaml + + on_...: + then: + - lvgl.pause: + show_snow: true + +.. _lvgl-resume-action: + +``lvgl.resume`` +*************** + +This :ref:`action ` resumes the activity of LVGL, including rendering. + +.. code-block:: yaml + + on_...: + then: + - lvgl.resume: + +``lvgl.update`` +*************** + +This :ref:`action ` allows changing/updating the ``disp_bg_color`` or ``disp_bg_image`` configuration variables of the main component, making it possible to change the background color or wallpaper at any time. + +.. code-block:: yaml + + # Examples: + on_...: + then: + - lvgl.update: + disp_bg_color: 0x0000FF + - lvgl.update: + disp_bg_image: cat_image + +.. _lvgl-page-next-previous-action: + +``lvgl.page.next``, ``lvgl.page.previous`` +****************************************** + +This :ref:`action ` changes the page to the next/previous based on the configuration (pages with their ``skip`` option enabled are...skipped). Page changes will wrap around at the end. + +- **animation** (*Optional*): Animate page changes as specified. One of: ``NONE``, ``OVER_LEFT``, ``OVER_RIGHT``, ``OVER_TOP``, ``OVER_BOTTOM``, ``MOVE_LEFT``, ``MOVE_RIGHT``, ``MOVE_TOP``, ``MOVE_BOTTOM``, ``FADE_IN``, ``FADE_OUT``, ``OUT_LEFT``, ``OUT_RIGHT``, ``OUT_TOP``, ``OUT_BOTTOM``. Defaults to ``NONE``. +- **time** (*Optional*, :ref:`Time `): Duration of the page change animation. Defaults to ``50ms``. + +.. code-block:: yaml + + on_...: + then: + - lvgl.page.next: + animation: OUT_LEFT + time: 300ms + + on_...: + then: + - lvgl.page.previous: + animation: OUT_RIGHT + time: 300ms + +.. _lvgl-page-show-action: + +``lvgl.page.show`` +****************** + +This :ref:`action ` shows a specific page (including pages with their ``skip`` option enabled). + +- **id** (**Required**): The ID of the page to be shown. +- **animation** (*Optional*): Animate page changes as specified. One of: ``NONE``, ``OVER_LEFT``, ``OVER_RIGHT``, ``OVER_TOP``, ``OVER_BOTTOM``, ``MOVE_LEFT``, ``MOVE_RIGHT``, ``MOVE_TOP``, ``MOVE_BOTTOM``, ``FADE_IN``, ``FADE_OUT``, ``OUT_LEFT``, ``OUT_RIGHT``, ``OUT_TOP``, ``OUT_BOTTOM``. Defaults to ``NONE``. +- **time** (*Optional*, :ref:`Time `): Duration of the page change animation. Defaults to ``50ms``. + +.. code-block:: yaml + + on_...: + then: + - lvgl.page.show: + id: secret_page + + on_...: + then: + - lvgl.page.show: secret_page # shorthand version + +.. _lvgl-conditions: + +Conditions +---------- + +.. _lvgl-is-idle-condition: + +``lvgl.is_idle`` +**************** + +This :ref:`condition ` checks if the amount of time specified has passed since the last touch event. + +- **timeout** (**Required**, :ref:`templatable `, int): Amount of :ref:`time ` expected since the last touch event. + +.. code-block:: yaml + + # In some trigger: + on_...: + then: + - if: + condition: lvgl.is_idle + timeout: 5s + then: + - light.turn_off: + id: display_backlight + transition_length: 3s + +.. _lvgl-is-paused-condition: + +``lvgl.is_paused`` +****************** + +This :ref:`condition ` checks if LVGL is in the paused state or not. + +.. code-block:: yaml + + # In some trigger: + on_...: + then: + - if: + condition: lvgl.is_paused + then: + - lvgl.resume: + +Triggers +-------- + +Widget level :ref:`interaction triggers ` can be configured universally, or depending on the widtget functionality. + +.. _lvgl-on-idle-trigger: + +``lvgl.on_idle`` +**************** + +LVGL has a notion of screen inactivity -- in other words, the time since the last user interaction with the screen is tracked. This can be used to dim the display backlight or turn it off after a moment of inactivity (like a screen saver). Every use of an input device (touchscreen, rotary encoder) counts as an activity and resets the inactivity counter. + +The ``on_idle`` :ref:`triggers ` are activated when inactivity time becomes longer than the specified ``timeout``. You can configure any desired number of timeouts with different actions. + +- **timeout** (**Required**, :ref:`templatable `, int): :ref:`Time ` that has elapsed since the last touch event, after which you want your actions to be performed. + +.. code-block:: yaml + + lvgl: + ... + on_idle: + - timeout: 30s + then: + - lvgl.page.show: main_page + - timeout: 60s + then: + - light.turn_off: display_backlight + - lvgl.pause: + + +See Also +-------- + +.. toctree:: + :maxdepth: 1 + :glob: + + * + +- :doc:`/components/display/index` +- :doc:`/components/touchscreen/index` +- :doc:`/components/sensor/rotary_encoder` +- `LVGL docs `__ +- :ghedit:`Edit` diff --git a/components/lvgl/widgets.rst b/components/lvgl/widgets.rst new file mode 100644 index 000000000..1700ee2b3 --- /dev/null +++ b/components/lvgl/widgets.rst @@ -0,0 +1,1788 @@ +LVGL Widgets +============ + +At the next level of the LVGL object hierarchy are the widgets, which support styling directly. They can have sub-parts, which may be styled separately. Usually styles are inherited, but this depends on widget specifics or functionality. The widget and its parts have states, and different styling can be set for different states. + +Widgets can have children, which can be any other widgets. Think of this as a nested structure. The child widgets move with the parent and, if the parent is hidden, its children will also be hidden. + +By default, LVGL draws new widgets on top of old widgets, including their children. When widgets have children, property inheritance takes place. Some properties (typically those related to text and opacity) can be inherited from the parent widgets's styles. When the property is inheritable, the parent will be searched for an object which specifies a value for the property. The parents will use their own :ref:`state ` to determine the value. For example, if a button is pressed and the text color is defined by the "pressed" state, this "pressed" text color will be used. + +Common properties +----------------- + +The properties below are common to all widgets. + +**Configuration variables:** + +- **id** (*Optional*, :ref:`config-id`): Manually specify the ID used for code generation. +- **x** (*Optional*, int16 or percentage): Horizontal position of the widget. +- **y** (*Optional*, int16 or percentage): Vertical position of the widget. + +.. note:: + + By default, the ``x`` and ``y`` coordinates are measured from the *top left corner* of the parent's content area. :ref:`Important `: content area starts *after the padding* thus if the parent has a non-zero padding value, position will be shifted with that. Percentage values are calculated from the parent's content area size. + + If specifying ``align``, ``x`` and ``y`` can be used as an offset to the calculated position (can also be negative). They are ignored if :ref:`lvgl-layouts` are used on the parent. + +- **height** (*Optional*): Height of the widget in pixels or a percentage, or ``SIZE_CONTENT``. +- **width** (*Optional*): Width of the widget in pixels or a percentage, or ``SIZE_CONTENT``. + +.. note:: + + The size settings support a special value: ``SIZE_CONTENT``. It means the widget's size in the respective direction will be set to the size of its children. Note that only children on the right and bottom sides will be considered and children on the top and left remain cropped. This limitation makes the behavior more predictable. Widgets with ``hidden`` or ``floating`` flags will be ignored by the ``SIZE_CONTENT`` calculation. + + Similarly to CSS, LVGL also supports ``min_width``, ``max_width``, ``min_height`` and ``max_height``. These are limits preventing a widget's size from becoming smaller/larger than these values. They are especially useful if the size is set by percentage or ``SIZE_CONTENT``. + +- **min_width**, **max_width**, **min_height**, **max_height** (*Optional*, int16 or percentage): Sets a minimal/maximal width or a minimal/maximal height. Pixel and percentage values can be used. Percentage values are relative to the dimensions of the parent's content area. Defaults to ``0%``. +- **scrollbar_mode** (*Optional*, string): If a child widget is outside its parent content area (the size without padding), the parent can become scrollable (see the ``scrollable`` :ref:`flag `). The widget can either be scrolled horizontally or vertically in one stroke. Scroll bars can appear depending on the setting: + - ``"OFF"``: Never show the scroll bars (use the double quotes!). + - ``"ON"``: Always show the scroll bars (use the double quotes!). + - ``"ACTIVE"``: Show scroll bars while a widget is being scrolled. + - ``"AUTO"``: Show scroll bars when the content is large enough to be scrolled (default). + +- **align** (*Optional*, dict): Alignment of the of the widget relative to the parent. A child widget is clipped to its parent boundaries. One of the values *not* starting with ``OUT_`` (see picture below). +- **align_to** (*Optional*, list): Alignment of the of the widget relative to another widget on the same level: + - **id** (**Required**): The ID of a widget *to* which you want to align. + - **align** (**Required**, string): Desired alignment (one of the values starting with ``OUT_``). + - **x** (*Optional*, int16 or percentage): Horizontal offset position. Default ``0``. + - **y** (*Optional*, int16 or percentage): Vertical offset position. Default ``0``. + +.. figure:: /components/lvgl/images/lvgl_align.png + :align: center + +- **group** (*Optional*, string): The name of the group of widgets which will interact with a :doc:`/components/sensor/rotary_encoder`. In every group there is always one focused widget which receives the encoder actions. You need to associate an input device with a group. An input device can send key events to only one group but a group can receive data from more than one input device. If no group is specified for a widget or an encoder, an unnamed default group will be assigned, so in most cases where only one encoder is used it will not be necessary to explicitly specify a group. +- **layout** (*Optional*): See :ref:`lvgl-layouts` for details. Defaults to ``NONE``. +- **styles** (*Optional*, :ref:`config-id`): The ID of a *style definition* from the main component configuration to override the theme styles. +- **theme** (*Optional*, list): A list of styles to apply to the widget and children. Same configuration option as at the main component. +- **widgets** (*Optional*, list): A list of LVGL widgets to be drawn as children of this widget. Same configuration option as at the main component. + +.. _lvgl-widgetproperty-state: + +- **state** (*Optional*, dict): Widgets or their (sub)parts can have have states, which support separate styling. These state styles inherit from the theme, but can be locally set or overridden within style definitions. Can be one of: + - **checked** (*Optional*, boolean): Toggled or checked state. + - **default** (*Optional*, boolean): Normal, released state. + - **disabled** (*Optional*, boolean): Disabled state (also usable with :ref:`shorthand ` actions ``lvgl.widget.enable`` and ``lvgl.widget.disable``). + - **edited** (*Optional*, boolean): Edit by an encoder. + - **focus_key** (*Optional*, boolean): Focused via keypad or encoder but *not* via touch screen. + - **focused** (*Optional*, boolean): Focused via keypad or encoder or clicked via touch screen. + - **pressed** (*Optional*, boolean): Being pressed. + - **scrolled** (*Optional*, boolean): Being scrolled. + - **user_1**, **user_2**, **user_3**, **user_4** (*Optional*, boolean): Custom states. + +By default, states are all ``false``, and they are templatable. +To apply styles to the states, you need to specify them one level above, for example: + +.. code-block:: yaml + + - button: + checkable: true + state: + checked: true # here you activate the state to be used at boot + checked: + bg_color: 0x00FF00 # here you apply styles to be used when in the respective state + +The state itself can be can be changed by interacting with the widget, or through :ref:`actions ` with ``lvgl.widget.update``. + +.. _lvgl-widget-flags: + +In addition to visual styling, each widget supports some boolean **flags** to influence the behavior: + +- **adv_hittest** (*Optional*, boolean): allow performing more accurate hit (click) test. For example, may help by accounting for rounded corners. +- **checkable** (*Optional*, boolean): toggle checked state when the widget is clicked. +- **click_focusable** (*Optional*, boolean): add focused state to the widget when clicked. +- **clickable** (*Optional*, boolean): make the widget clickable by input devices. Defaults to ``true``. If ``false``, it will pass the click to the widgets behind it (clicking through). +- **event_bubble** (*Optional*, boolean): propagate the events to the parent. +- **floating** (*Optional*, boolean): do not scroll the widget when the parent scrolls and ignore layout. +- **gesture_bubble** (*Optional*, boolean): propagate the gestures to the parent. +- **hidden** (*Optional*, boolean): make the widget hidden (like it wasn't there at all), also usable with :ref:`shorthand ` actions ``lvgl.widget.show`` and ``lvgl.widget.hide``. Hidden objects are ignored in layout calculations. Defaults to ``false``. +- **ignore_layout** (*Optional*, boolean): the widget is simply ignored by the layouts. Its coordinates can be set as usual. +- **layout_1**, **layout_2** (*Optional*, boolean): custom flags, free to use by layouts. +- **overflow_visible** (*Optional*, boolean): do not clip the children's content to the parent's boundary. +- **press_lock** (*Optional*, boolean): keep the widget pressed even if the press slid from the widget. +- **scroll_chain simple** (*Optional*, boolean): packaging for (``scroll_chain_hor | scroll_chain_ver``). +- **scroll_chain_hor** (*Optional*, boolean): allow propagating the horizontal scroll to a parent. +- **scroll_chain_ver** (*Optional*, boolean): allow propagating the vertical scroll to a parent. +- **scroll_elastic** (*Optional*, boolean): allow scrolling inside but with slower speed. +- **scroll_momentum** (*Optional*, boolean): make the widget scroll further when "thrown". +- **scroll_on_focus** (*Optional*, boolean): automatically scroll widget to make it visible when focused. +- **scroll_one** (*Optional*, boolean): allow scrolling only on ``snappable`` children. +- **scroll_with_arrow** (*Optional*, boolean): allow scrolling the focused widget with arrow keys. +- **scrollable** (*Optional*, boolean): the widget can become scrollable. Defaults to ``true`` (also see the ``scrollbar_mode`` property). +- **snappable** (*Optional*, boolean): if scroll snap is enabled on the parent it can snap to this widget. +- **user_1**, **user_2**, **user_3**, **user_4** (*Optional*, boolean): custom flags, free to use by user. +- **widget_1**, **widget_2** (*Optional*, boolean): custom flags, free to use by widget. + +.. note:: + + LVGL only supports **integers** for numeric ``value``. Visualizer widgets can't display floats directly, but they allow scaling by 10s. + +.. _lvgl-widget-animimg: + +``animimg`` +----------- + +The animation image is similar to the normal ``image`` widget. The main difference is that instead of one source image, you set a list of multiple source images. You can also specify a duration and a repeat count. + +.. figure:: /components/lvgl/images/lvgl_animimg.gif + :align: center + +**Configuration variables:** + +- **src** (**Required**, list of :ref:`images `): A list of IDs of existing image configurations to be loaded as frames of the animation. +- **auto_start** (*Optional*, boolean): Start the animation playback automatically at boot and when updating the widget. Defaults to ``true``. +- **duration** (**Required**, :ref:`Time `): Total duration of a playback cycle (each frame is displayed for an equal amount of time). +- **repeat_count** (*Optional*, int16 or *forever*): The number of times playback should be repeated. Defaults to ``forever``. +- Some style options from :ref:`lvgl-styling` for the background rectangle that uses the typical background style properties and the image itself using the image style properties. + +**Actions:** + +- ``lvgl.animimg.start`` :ref:`action ` starts the animation playback if it was displayed with ``auto_start`` false or after ``repeat_count`` expired. + - **id** (**Required**): The ID or a list of IDs of animimg widgets which you want start. + +- ``lvgl.animimg.stop`` :ref:`action ` stops the animation playback. + - **id** (**Required**): The ID or a list of IDs of animimg widgets which you want stop. + +- ``lvgl.animimg.update`` :ref:`action ` can be used to change ``repeat_count`` and ``duration``, just like the :ref:`lvgl.widget.update ` action is used for the common styles, states or flags. ``src`` and ``auto_start`` cannot be updated at runtime. + - **id** (**Required**): The ID or a list of IDs of animimg widgets which you want update. + - Widget styles or properties from the specific options above, which you want update. + +**Triggers:** + +- :ref:`interaction ` LVGL event triggers. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - animimg: + align: CENTER + id: anim_id + src: [ cat_image, cat_image_bowtie ] + duration: 1000ms + + # Example actions: + on_...: + then: + - lvgl.animimg.update: + id: anim_id + repeat_count: 100 + duration: 300ms + +.. _lvgl-widget-arc: + +``arc`` +------- + +The arc consists of a background and a foreground arc. The indicator foreground can be touch-adjusted with a knob. + +.. figure:: /components/lvgl/images/lvgl_arc.png + :align: center + +**Configuration variables:** + +- **adjustable** (*Optional*, boolean): Add a knob that the user can move to change the value. Defaults to ``false``. +- **arc_color** (*Optional*, :ref:`color `): Color used to draw the arc. +- **arc_opa** (*Optional*, :ref:`opacity `): Opacity of the arc. +- **arc_rounded** (*Optional*, boolean): Make the end points of the arcs rounded. ``true`` rounded, ``false`` perpendicular line ending. +- **arc_width** (*Optional*, int16): Set the width of the arcs in pixels. +- **change_rate** (*Optional*, int8): If the arc is pressed the current value will set with a limited speed according to the set change rate. The change rate is defined in degree/second. Defaults to ``720``. +- **end_angle** (*Optional*, 0-360): end angle of the arc background (see note). Defaults to ``45``. +- **indicator** (*Optional*, list): Settings for the indicator *part* to show the value. Supports a list of :ref:`styles ` and state-based styles to customize. Draws *another arc using the arc style* properties. Its padding values are interpreted relative to the background arc. +- **knob** (*Optional*, list): Settings for the knob *part* to control the value. Supports a list of :ref:`styles ` and state-based styles to customize. Draws a handle on the end of the indicator using all background properties and padding values. With zero padding the knob size is the same as the indicator's width. Larger padding makes it larger, smaller padding makes it smaller. +- **max_value** (*Optional*, int8): Maximum value of the indicator. Defaults to ``100``. +- **min_value** (*Optional*, int8): Minimum value of the indicator. Defaults to ``0``. +- **mode** (*Optional*, string): ``NORMAL``: the indicator is drawn from the minimum value to the current. ``REVERSE``: the indicator is drawn counter-clockwise from the maximum value to the current. ``SYMMETRICAL``: the indicator is drawn from the middle point to the current value. Defaults to ``NORMAL``. +- **rotation** (*Optional*, 0-360): Offset to the 0 degree position. Defaults to ``0.0``. +- **start_angle** (*Optional*, 0-360): start angle of the arc background (see note). Defaults to ``135``. +- **value** (**Required**, int8): Actual value of the indicator at start, in ``0``-``100`` range. Defaults to ``0``. +- Any :ref:`Styling ` and state-based option to override styles inherited from parent. The arc's size and position will respect the padding style properties. + +If the ``adv_hittest`` :ref:`flag ` is enabled the arc can be clicked through in the middle. Clicks are recognized only on the ring of the background arc. + +.. note:: + + The zero degree position is at the middle right (3 o'clock) of the widget and the degrees increase in a clockwise direction from there. Angles are specified in the ``0``-``360`` range. + +**Actions:** + +- ``lvgl.arc.update`` :ref:`action ` updates the widget styles and properties from the specific options above, just like the :ref:`lvgl.widget.update ` action is used for the common styles, states or flags. + - **id** (**Required**): The ID or a list of IDs of arc widgets which you want update. + - Widget styles or properties from the specific options above, which you want update. + +**Triggers:** + +- ``on_value`` :ref:`trigger ` is activated when the knob changes the value of the arc. The new value is returned in the variable ``x``. +- :ref:`interaction ` LVGL event triggers which also return the value in ``x``. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - arc: + x: 10 + y: 10 + id: arc_id + value: 75 + min_value: 0 + max_value: 100 + adjustable: true + + # Example action: + on_...: + then: + - lvgl.arc.update: + id: arc_id + knob: + bg_color: 0x00FF00 + value: 55 + + # Example trigger: + - arc: + ... + on_value: + - logger.log: + format: "Arc value is: %.0f" + args: [ 'x' ] + +.. note:: + + The ``on_value`` trigger is sent as the arc knob is dragged or changed with keys. The event is sent *continuously* while the arc knob is being dragged; this generally has a negative effect on performance. To mitigate this, consider using a :ref:`universal interaction trigger ` like ``on_release``, to get the ``x`` variable once after the interaction has completed. + +The ``arc`` can be also integrated as :doc:`Number ` or :doc:`Sensor ` component. + +.. _lvgl-widget-bar: + +``bar`` +------- + +The bar widget has a background and an indicator foreground on it. The size of the indicator is set according to the current ``value`` of the bar. + +.. figure:: /components/lvgl/images/lvgl_bar.png + :align: center + +Vertical bars can be created if the width is smaller than the height. + +Not only the end, but also the start value of the bar can be set, which changes the start position of the indicator. + +**Configuration variables:** + +- **anim_time** (*Optional*, :ref:`Time `): Sets the animation time if the value is set with ``animated: true``. +- **animated** (*Optional*, boolean): Animate the indicator when the bar changes value. Defaults to ``true``. +- **indicator** (*Optional*, list): Settings for the indicator *part* to show the value. Supports a list of :ref:`styles ` and state-based styles to customize, all the typical background properties. +- **max_value** (*Optional*, int8): Maximum value of the indicator. Defaults to ``100``. +- **min_value** (*Optional*, int8): Minimum value of the indicator. Defaults to ``0``. +- **mode** (*Optional*, string): ``NORMAL``: the indicator is drawn from the minimum value to the current. ``REVERSE``: the indicator is drawn counter-clockwise from the maximum value to the current. ``SYMMETRICAL``: the indicator is drawn from the middle point to the current value. Defaults to ``NORMAL``. +- **value** (**Required**, int8): Actual value of the indicator at start, in ``0``-``100`` range. Defaults to ``0``. +- Style options from :ref:`lvgl-styling`. The background of the bar and it uses the typical background style properties. Adding padding will make the indicator smaller or larger. + +**Actions:** + +- ``lvgl.bar.update`` :ref:`action ` updates the widget styles and properties from the specific options above, just like the :ref:`lvgl.widget.update ` action is used for the common styles, states or flags. + - **id** (**Required**): The ID or a list of IDs of bar widgets which you want update. + - Widget styles or properties from the specific options above, which you want update. + +**Triggers:** + +- :ref:`interaction ` LVGL event triggers. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - bar: + x: 10 + y: 100 + id: bar_id + value: 75 + min_value: 1 + max_value: 100 + + # Example action: + on_...: + then: + - lvgl.bar.update: + id: bar_id + value: 55 + +The ``bar`` can be also integrated as :doc:`Number ` or :doc:`Sensor ` component. + +.. _lvgl-widget-button: + +``button`` +---------- + +Simple push (momentary) or toggle (two-states) button. + +.. figure:: /components/lvgl/images/lvgl_button.png + :align: center + +**Configuration variables:** + +- **checkable** (*Optional*, boolean): A significant :ref:`flag ` to make a toggle button (which remains pressed in ``checked`` state). Defaults to ``false``. +- Style options from :ref:`lvgl-styling` for the background of the button. Uses the typical background style properties. + +A notable state is ``checked`` (boolean) which can have different styles applied. + +**Triggers:** + +- ``on_value`` :ref:`trigger ` is activated after clicking. If ``checkable`` is ``true``, the boolean variable ``x``, representing the checked state, may be used by lambdas within this trigger. +- :ref:`interaction ` LVGL event triggers. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - button: + x: 10 + y: 10 + width: 50 + height: 30 + id: btn_id + +To have a button with a text label on it, add a child :ref:`lvgl-widget-label` widget to it: + +.. code-block:: yaml + + # Example toggle button with text: + - button: + x: 10 + y: 10 + width: 70 + height: 30 + id: btn_id + checkable: true + widgets: + - label: + align: center + text: "Light" + + # Example trigger: + - button: + ... + on_value: + then: + - logger.log: + format: "Button checked state: %d" + args: [ x ] + +The ``button`` can be also integrated as a :doc:`Binary Sensor ` or as a :doc:`Switch ` component. + +.. _lvgl-widget-buttonmatrix: + +``buttonmatrix`` +---------------- + +The button matrix widget is a lightweight way to display multiple buttons in rows and columns. It's lightweight because the buttons are not actually created but instead simply drawn on the fly. This reduces the memory footprint of each button from approximately 200 bytes (for both the button and its label widget) down to only eight bytes. + +.. figure:: /components/lvgl/images/lvgl_buttonmatrix.png + :align: center + +**Configuration variables:** + +- **rows** (**Required**, list): A list for the button rows: + - **buttons** (**Required**, list): A list of buttons in a row: + - **id** (*Optional*): An ID for the button in the matrix. + - **key_code** (*Optional*, string): One character be sent as the key code to a :ref:`key_collector` instead of ``text`` when the button is pressed. + - **selected** (*Optional*, boolean): Set the button as the most recently released or focused. Defaults to ``false``. + - **text** (*Optional*): Text (or built-in :ref:`symbol ` codepoint) to display on the button. + - **width** (*Optional*): Width relative to the other buttons in the same row. Must be a value between ``1`` and ``15``; the default is ``1`` (for example, given a line with two buttons, one with ``width: 1`` and another one with ``width: 2``, the first will be ``33%`` wide while the second will be ``66%`` wide). + - **control** (*Optional*): Binary flags to control behavior of the buttons (all ``false`` by default): + - **checkable** (*Optional*, boolean): Enable toggling of a button, ``checked`` state will be added/removed as the button is clicked. + - **checked** (*Optional*, boolean): Make the button checked. Apply ``checked`` styles to the button. + - **click_trig** (*Optional*, boolean): Control how to :ref:`trigger ` ``on_value`` : if ``true`` on *click*, if ``false`` on *press*. + - **custom_1** and **custom_2** (*Optional*, boolean): Custom, free to use flags. + - **disabled** (*Optional*, boolean): Apply ``disabled`` styles to the button. + - **hidden** (*Optional*, boolean): Make a button hidden (hidden buttons still take up space in the layout, they are just not visible or clickable). + - **no_repeat** (*Optional*, boolean): Disable repeating when the button is long pressed. + - **popover** (*Optional*, boolean): Show the button label in a popover when pressing this button. + - **recolor** (*Optional*, boolean): Enable recoloring of button text with ``#``. For example: ``It's #FF0000 red#`` + +- **items** (*Optional*, list): Settings for the items *part*, the buttons all use the text and typical background style properties except translations and transformations. +- **one_checked** (*Optional*, boolean): Allow only one button to be checked at a time (aka. radio buttons). Defaults to ``false``. +- Style options from :ref:`lvgl-styling` for the background of the button matrix, uses the typical background style properties. ``pad_row`` and ``pad_column`` set the space between the buttons. + +**Actions:** + +- ``lvgl.buttonmatrix.update`` :ref:`action ` updates the item styles and properties specified in the specific ``state``, ``items`` options. + - **id** (**Required**): The ID or a list of IDs of buttonmatrix widgets which you want update. + - Widget styles or properties from ``state``, ``items`` options above, which you want update. + +- ``lvgl.matrix.button.update`` :ref:`action ` updates the button styles and properties specified in the specific ``control``, ``width`` and ``selected`` options. + - **id** (**Required**): The ID or a list of IDs of matrix buttons which you want update. + - Widget styles or properties from ``control``, ``width`` and ``selected`` options above, which you want update. + +**Triggers:** + +- ``on_value`` and :ref:`interaction ` triggers can be configured for each button, is activated after clicking. If ``checkable`` is ``true``, the boolean variable ``x``, representing the checked state, may be used by lambdas within this trigger. +- The :ref:`interaction ` LVGL event triggers can be configured for the main widget, they pass the ID of the pressed button (or null if nothing pressed) as variable ``x`` (a pointer to a ``uint16_t`` which holds the index number of the button). + +**Example:** + +.. code-block:: yaml + + # Example widget: + - buttonmatrix: + x: 10 + y: 40 + width: 220 + items: + pressed: + bg_color: 0xFFFF00 + id: matrix_id + rows: + - buttons: + - id: button_1 + text: "\uF04B" + control: + checkable: true + - id: button_2 + text: "\uF04C" + control: + checkable: true + - buttons: + - id: button_3 + text: "A" + control: + popover: true + - id: button_4 + text: "B" + control: + disabled: true + - buttons: + - id: button_5 + text: "It's #ff0000 red#" + width: 2 + control: + recolor: true + + # Example action: + on_...: + then: + - lvgl.matrix.button.update: + id: button_1 + width: 1 + selected: true + control: + checkable: false + - lvgl.buttonmatrix.update: + id: matrix_id + state: + disabled: true + items: + bg_color: 0xf0f0f0 + + # Example trigger: + - buttonmatrix: + ... + rows: + - buttons: + ... + - id: button_2 + ... + control: + checkable: true + on_value: # Trigger for the individual button, returning the checked state + then: + - logger.log: + format: "Button 2 checked: %d" + args: [ x ] + on_press: # Triggers for the matrix, to determine which button was pressed. + logger.log: + format: "Matrix button pressed: %d" + args: ["x"] # If x is 65535, it was the container, (or through a disabled button). + on_click: + logger.log: + format: "Matrix button clicked: %d, is button_2 = %u" + args: ["x", "id(button_2) == x"] + +.. tip:: + + The Button Matrix widget supports the :ref:`key_collector` to collect the button presses as key press sequences for further automations. + +.. _lvgl-widget-checkbox: + +``checkbox`` +------------ + +The checkbox widget is made internally from a *tick box* and a label. When the checkbox is clicked the tick box's ``checked`` state will be toggled. + +.. figure:: /components/lvgl/images/lvgl_checkbox.png + :align: center + +**Configuration variables:** + +- **indicator** (*Optional*, list): Settings for the indicator *part* to show the value. Supports a list of :ref:`styles ` and state-based styles to customize. The "tick box" is a square that uses all the typical background style properties. By default, its size is equal to the height of the main part's font. Padding properties make the tick box larger in the respective directions. +- Style options from :ref:`lvgl-styling` for the background of the widget and it uses the text and all the typical background style properties. ``pad_column`` adjusts the spacing between the tick box and the label. + +**Actions:** + +- ``lvgl.checkbox.update`` :ref:`action ` updates the widget styles and properties from the specific options above, just like the :ref:`lvgl.widget.update ` action is used for the common styles, states or flags. + - **id** (**Required**): The ID or a list of IDs of checkbox widgets which you want update. + - **text** (**Required**, :ref:`templatable `, string): The ``text`` option in this action can contain static text, a :ref:`lambda ` outputting a string or can be formatted using ``printf``-style formatting (see :ref:`display-printf`). + - **format** (*Optional*, string): The format for the message in :ref:`printf-style `. + - **args** (*Optional*, list of :ref:`lambda `): The optional arguments for the format message. + - Widget styles or properties from the specific options above, which you want update. + +**Triggers:** + +``on_value`` :ref:`trigger ` is activated when toggling the checkbox. The boolean variable ``x``, representing the checkbox's state, may be used by lambdas within this trigger. +- :ref:`interaction ` LVGL event triggers which also return the value in ``x``. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - checkbox: + x: 10 + y: 10 + id: checkbox_id + text: Checkbox + + # Example action: + on_...: + then: + - lvgl.checkbox.update: + id: checkbox_id + state: + checked: true + text: Checked + + # Example trigger: + - checkbox: + ... + on_value: + then: + - logger.log: + format: "Checkbox state: %d" + args: [ x ] + +.. note:: + + In case you configure ``default_font`` in the main section to a custom font, the checkmark will not be shown correctly when the checkbox is in the checked state. + +The ``checkbox`` can be also integrated as a :doc:`Switch ` component. + +.. _lvgl-widget-dropdown: + +``dropdown`` +------------ + +The dropdown widget allows the user to select one value from a list. + +The dropdown list is closed by default and displays a single value. When activated (by clicking on the drop-down list), a list is drawn from which the user may select one option. When the user selects a new value, the list is deleted from the screen. + +.. figure:: /components/lvgl/images/lvgl_dropdown.png + :align: center + +The Dropdown widget is built internally from a *button* part and a *list* part (both not related to the actual widgets with the same name). + +**Configuration variables:** + +- **dir** (*Optional*, dict): Where the list part of the dropdown gets created relative to the button part. ``LEFT``, ``RIGHT``, ``BOTTOM``, ``TOP``, defaults to ``BOTTOM``. +- **dropdown_list** (*Optional*, list): Settings for the dropdown_list *part*, the list with items. Supports a list of :ref:`styles ` to customize. Notable are ``text_line_space`` and ``pad_all`` for spacing of list items, and ``text_font`` to separately change the font in the list. +- **indicator** (*Optional*, list): Settings for the the parent of ``symbol``. Supports a list of :ref:`styles ` to customize. +- **options** (**Required**, list): The list of available options in the drop-down. +- **scrollbar** (*Optional*, list): Settings for the scrollbar *part*. Supports a list of :ref:`styles ` to customize. The scrollbar background, border, shadow properties and width (for its own width) and right padding for the spacing on the right. +- **selected_index** (*Optional*, int8): The index of the item you wish to be selected. +- **selected** (*Optional*, list): Settings for the selected item in the list. Supports a list of :ref:`styles ` to customize. +- **symbol** (*Optional*, dict): A symbol (typically an chevron) is shown in dropdown list. If ``dir`` of the drop-down list is ``LEFT`` the symbol will be shown on the left, otherwise on the right. Choose a different :ref:`symbol ` from those built-in or from your own customized font. +- Style options from :ref:`lvgl-styling` for the background of the button and the list. Uses the typical background properties and :ref:`lvgl-widget-label` text properties for the text on it. ``max_height`` can be used to limit the height of the list. ``text_font`` can be used to set the font of the button part, including the symbol. + +**Actions:** + +- ``lvgl.dropdown.update`` :ref:`action ` updates the widget styles and properties from the specific options above, just like the :ref:`lvgl.widget.update ` action is used for the common styles, states or flags. + - **id** (**Required**): The ID or a list of IDs of dropdown widgets which you want update. + - Widget styles or properties from the specific options above, which you want update. + +**Triggers:** + +- ``on_value`` :ref:`trigger ` is activated only when you select an item from the list. The new selected index is returned in the variable ``x``. The :ref:`interaction ` LVGL event triggers also apply, and they also return the selected index in ``x``. +- ``on_cancel`` :ref:`trigger ` is also activated when you close the dropdown without selecting an item from the list. The currently selected index is returned in the variable ``x``. +- :ref:`interaction ` LVGL event triggers which also return the value in ``x``. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - dropdown: + id: dropdown_id + width: 90 + align: CENTER + options: + - Violin + - Piano + - Bassoon + - Chello + - Drums + selected_index: 2 + + # Example action: + on_...: + then: + - lvgl.dropdown.update: + id: dropdown_id + selected_index: 4 + + # Example trigger: + - dropdown: + ... + on_value: + - logger.log: + format: "Selected index is: %d" + args: [ x ] + on_cancel: + - logger.log: + format: "Dropdown closed. Selected index is: %d" + args: [ x ] + +The ``dropdown`` can be also integrated as :doc:`Select ` component. + +.. _lvgl-widget-image: + +``image`` +--------- + +Images are the basic widgets used to display images. + +.. figure:: /components/lvgl/images/lvgl_image.png + :align: center + +**Configuration variables:** + +- **angle** (*Optional*, 0-360): Rotation of the image. Defaults to ``0.0``. Needs ``pivot_x`` and ``pivot_y`` to be specified. +- **antialias** (*Optional*): The quality of the angle or scale transformation. When anti-aliasing is enabled, the transformations are higher quality but slower. Defaults to ``false``. +- **mode** (*Optional*): Either ``REAL`` or ``VIRTUAL``. With ``VIRTUAL``, when the image is scaled or rotated, the real coordinates of the image object are not changed. The larger content simply overflows the object's boundaries. It also means the layouts are not affected the by the transformations. With ``REAL``, if the width/height of the object is set to ``SIZE_CONTENT``, the object's size will be set to the scaled and rotated size. If an explicit size is set, the overflowing content will be cropped. Defaults to ``VIRTUAL``. +- **offset_x** (*Optional*): Add a horrizontal offset to the image position. +- **offset_y** (*Optional*): Add a vertical offset to the image position. +- **pivot_x** (*Optional*): Horizontal position of the pivot point of rotation, in pixels, relative to the top left corner of the image. +- **pivot_y** (*Optional*): Vertical position of the pivot point of rotation, in pixels, relative to the top left corner of the image. +- **scale** (*Optional*, 0.1-10): Zoom of the image. +- **src** (**Required**, :ref:`image `): The ID of an existing image configuration. +- Some style options from :ref:`lvgl-styling` for the background rectangle that uses the typical background style properties and the image itself using the image style properties. + +**Actions:** + +- ``lvgl.image.update`` :ref:`action ` updates the widget styles and properties from the specific options above, just like the :ref:`lvgl.widget.update ` action is used for the common styles, states or flags. Updating the ``src`` option changes the image at runtime. + - **id** (**Required**): The ID or a list of IDs of image widgets which you want update. + - Widget styles or properties from the specific options above, which you want update. + +**Triggers:** + +- :ref:`interaction ` LVGL event triggers. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - image: + align: CENTER + src: cat_image + id: img_id + radius: 11 + clip_corner: true + + # Example action: + on_...: + then: + - lvgl.image.update: + id: img_id + src: cat_image_bowtie + +.. note:: + + Currently ``RGB565`` type images are supported, with transparency using the optional parameter ``use_transparency`` set to ``true``. See :ref:`display-image` for how to load an image for rendering in ESPHome. + +.. tip:: + + ``offset_x`` and ``offset_y`` can be useful when the widget size is set to be smaller than the image source size. A "running image" effect can be created by animating these values. + +.. _lvgl-widget-keyboard: + +``keyboard`` +------------ + +The keyboard widget is a special Button matrix with predefined keymaps and other features to show an on-screen keyboard usable to type text into a :ref:`lvgl-widget-textarea`. + +.. figure:: /components/lvgl/images/lvgl_keyboard.png + :align: center + +For styling, the ``keyboard`` widget uses the same settings as :ref:`lvgl-widget-buttonmatrix`. + +**Configuration variables:** + +- **textarea** (*Optional*): The ID of the ``textarea`` from which to receive the keystrokes. +- **mode** (*Optional*, dict): Keyboard layout to use. Each ``TEXT_`` layout contains a button to allow the user to iterate through the ``TEXT_`` layouts. + - ``TEXT_LOWER``: Display lower case letters (default). + - ``TEXT_UPPER``: Display upper case letters. + - ``TEXT_SPECIAL``: Display special characters. + - ``NUMBER``: Display numbers, +/- sign, and decimal dot. + +**Actions:** + +- ``lvgl.keyboard.update`` :ref:`action ` updates the widget styles and properties from the specific options above, just like the :ref:`lvgl.widget.update ` action is used for the common styles, states or flags. + - **id** (**Required**): The ID or a list of IDs of keyboard widgets which you want update. + - Widget styles or properties from the specific options above, which you want update. + +**Triggers:** + +- ``on_ready`` :ref:`trigger ` is activated when the checkmark key is pressed. +- ``on_cancel`` :ref:`trigger ` is activated when the key containing the keyboard icon is pressed. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - keyboard: + id: keyboard_id + textarea: textarea_1 + mode: TEXT_UPPER + + # Example actions: + on_focus: + then: + - lvgl.keyboard.update: + id: keyboard_id + mode: number + textarea: textarea_2 + + # Example trigger: + - keyboard: + ... + on_ready: + then: + - logger.log: Keyboard is ready + on_cancel: + then: + - logger.log: Keyboard cancelled + +.. tip:: + + The Keyboard widget supports the :ref:`key_collector` to collect the button presses as key press sequences for further automations. + +.. note:: + + The Keyboard widget in ESPHome doesn't support popovers or custom layouts. + +.. _lvgl-widget-label: + +``label`` +--------- + +A label is the basic widget type that is used to display text. + +.. figure:: /components/lvgl/images/lvgl_label.png + :align: center + +**Configuration variables:** + +- **long_mode** (*Optional*, list): By default, the width and height of the label is set to ``SIZE_CONTENT``. Therefore, the size of the label is automatically expanded to the text size. Otherwise, if the ``width`` or ``height`` are explicitly set (or set by :ref:`lvgl-layouts`), the lines wider than the label's width can be manipulated according to the long mode policies below. These policies can be applied if the height of the text is greater than the height of the label. + - ``WRAP``: Wrap lines which are too long. If the height is ``SIZE_CONTENT``, the label's height will be expanded, otherwise the text will be clipped (default). + - ``DOT``: Replaces the last 3 characters from bottom right corner of the label with dots. + - ``SCROLL``: If the text is wider than the label, scroll the text horizontally back and forth. If it's higher, scroll vertically. Text will scroll in only one direction; horizontal scrolling has higher precedence. + - ``SCROLL_CIRCULAR``: If the text is wider than the label, continuously scroll the text horizontally. If it's higher, scroll vertically. Text will scroll in only one direction; horizontal scrolling has higher precedence. + - ``CLIP``: Simply clip the parts of the text outside the label. +- **recolor** (*Optional*, boolean): Enable recoloring of button text with ``#``. This makes it possible to set the color of characters in the text individually by prefixing the text to be re-colored with a ``#RRGGBB`` hexadecimal color code followed by a *space*, and finally closed with a single hash ``#`` tag. For example: ``Write a #FF0000 red# word``. +- **scrollbar** (*Optional*, list): Settings for the indicator *part* to show the value. Supports a list of :ref:`styles ` and state-based styles to customize. The scroll bar that is shown when the text is larger than the widget's size. +- **selected** (*Optional*, list): Settings for the the style of the selected text. Only ``text_color`` and ``bg_color`` style properties can be used. +- **text_align** (*Optional*, dict): Alignment of the text in the widget - it doesn't align the object itself, only the lines inside the object. One of ``LEFT``, ``CENTER``, ``RIGHT``, ``AUTO``. Inherited from parent. Defaults to ``AUTO``, which detects the text base direction and uses left or right alignment accordingly. +- **text_color** (*Optional*, :ref:`color `): Color to render the text in. Inherited from parent. Defaults to ``0`` (black). +- **text_decor** (*Optional*, list): Choose decorations for the text: ``NONE``, ``UNDERLINE``, ``STRIKETHROUGH`` (multiple can be specified as YAML list). Inherited from parent. Defaults to ``NONE``. +- **text_font**: (*Optional*, :ref:`font `): The ID of the font used to render the text or symbol. Inherited from parent. +- **text_letter_space** (*Optional*, int16): Extra character spacing of the text. Inherited from parent. Defaults to ``0``. +- **text_line_space** (*Optional*, int16): Line spacing of the text. Inherited from parent. Defaults to ``0``. +- **text_opa** (*Optional*, :ref:`opacity `): Opacity of the text. Inherited from parent. Defaults to ``COVER``. +- **text** (**Required**, string): The text (or built-in :ref:`symbol ` codepoint) to display. To display an empty label, specify ``""``. +- Style options from :ref:`lvgl-styling`. Uses all the typical background properties and the text properties. The padding values can be used to add space between the text and the background. + +.. note:: + + Newline escape sequences are handled automatically by the label widget. You can use ``\n`` to make a line break. For example: ``"line1\nline2\n\nline4"``. For escape sequences like newline to be translated, *enclose the string in double quotes*. + +**Actions:** + +- ``lvgl.label.update`` :ref:`action ` updates the widget styles and properties from the specific options above, just like the :ref:`lvgl.widget.update ` action is used for the common styles, states or flags. + - **id** (**Required**): The ID or a list of IDs of label widgets which you want update. + - **text** (**Required**, :ref:`templatable `, string): The ``text`` option in this action can contain static text, a :ref:`lambda ` outputting a string or can be formatted using ``printf``-style formatting (see :ref:`display-printf`). + - **format** (*Optional*, string): The format for the message in :ref:`printf-style `. + - **args** (*Optional*, list of :ref:`lambda `): The optional arguments for the format message. + - Widget styles or properties from the specific options above, which you want update. + +**Triggers:** + +- :ref:`interaction ` LVGL event triggers. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - label: + align: CENTER + id: lbl_id + recolor: true + text: "#FF0000 write# #00FF00 colored# #0000FF text#" + + - label: + align: TOP_MID + id: lbl_symbol + text_font: montserrat_28 + text: "\uF013" + + # Example action (update label with a value from a sensor): + on_...: + then: + - lvgl.label.update: + id: lbl_id + text: + format: "%.0fdBm" + args: [ 'id(wifi_signal_db).get_state()' ] + +The ``label`` can be also integrated as :doc:`Text ` or :doc:`Text Sensor ` component. + +.. _lvgl-widget-led: + +``led`` +------- + +The LED widgets are either circular or rectangular widgets whose brightness can be adjusted. As their brightness decreases, the colors become darker. + +.. figure:: /components/lvgl/images/lvgl_led.png + :align: center + +**Configuration variables:** + +- **brightness** (*Optional*, percentage): The brightness of the LED color, where ``0%`` corresponds to black, and ``100%`` corresponds to the full brightness of the color specified above. +- **color** (*Optional*, :ref:`color `): Color for the background, border, and shadow of the widget. +- Style options from :ref:`lvgl-styling`, using all the typical background style properties. + +**Actions:** + +- ``lvgl.led.update`` :ref:`action ` updates the widget styles and properties from the specific options above, just like the :ref:`lvgl.widget.update ` action is used for the common styles, states or flags. + - **id** (**Required**): The ID or a list of IDs of led widgets which you want update. + - Widget styles or properties from the specific options above, which you want update. + +**Triggers:** + +- :ref:`interaction ` LVGL event triggers. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - led: + id: led_id + align: CENTER + color: 0xFF0000 + brightness: 70% + + # Example action: + on_...: + then: + - lvgl.led.update: + id: led_id + color: 0x00FF00 + +The ``led`` can be also integrated as :doc:`Light ` component. + +.. note:: + + If configured as a light component, ``color`` and ``brightness`` are overridden by the light at startup, according to its ``restore_mode`` setting. + +.. _lvgl-widget-line: + +``line`` +-------- + +The line widget is capable of drawing straight lines between a set of points. + +.. figure:: /components/lvgl/images/lvgl_line.png + :align: center + +**Configuration variables:** + +- **line_color** (*Optional*, :ref:`color `): Color for the line. +- **line_dash_gap** (*Optional*, int16): Set the width of the gap between the dashes in the line (in pixels). +- **line_dash_width** (*Optional*, int16): Set the width of the dashes in the line (in pixels). +- **line_rounded** (*Optional*, boolean): Make the end points of the line rounded. ``true`` rounded, ``false`` perpendicular line ending. +- **line_width** (*Optional*, int16): Set the width of the line in pixels. +- **points** (**Required**, list): A list of ``x, y`` integer pairs for point coordinates (origin from top left of parent) +- Style options from :ref:`lvgl-styling`, all the typical background properties and line style properties. + +By default, the Line widget width and height dimensions are set to ``SIZE_CONTENT``. This means it will automatically set its size to fit all the points. If the size is set explicitly, parts of the line may not be visible. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - line: + points: + - 5, 5 + - 70, 70 + - 120, 10 + - 180, 60 + - 230, 15 + line_width: 8 + line_color: 0x0000FF + line_rounded: true + +.. _lvgl-widget-meter: + +``meter`` +--------- + +The meter widget can visualize data in very flexible ways. It can use arcs, needles, ticks, lines and/or labels. + +.. figure:: /components/lvgl/images/lvgl_meter.png + :align: center + +**Configuration variables:** + +- **scales** (**Required**, list): A list with (any number of) scales to be added to the meter. + - **angle_range** (**Required**): The angle between start and end of the tick scale. Defaults to ``270``. + - **indicators** (**Required**, list): A list with indicators to be added to the scale. Multiple of each can be added. Their values are interpreted in the range of the scale: + - **arc** (*Optional*): Add a background arc the scale: + - **color**: :ref:`Color ` to draw the arc. Defaults to ``0`` (black). + - **end_value**: The value in the scale range to end drawing the arc to. + - **r_mod**: Adjust the position of the arc from the scale radius with this amount (can be negative). Defaults to ``0``. + - **start_value**: The value in the scale range to start drawing the arc from. + - **width**: Arc width in pixels. Defaults to ``4``. + - Style options for the *arc* using the :ref:`lvgl-widget-arc` style properties. + - **image** (*Optional*): Add a rotating needle image to the scale: + - **id**: Manually specify the :ref:`config-id` used for updating the indicator value at runtime. + - **pivot_x**: Horizontal position of the pivot point of rotation, in pixels, relative to the top left corner of the image. + - **pivot_y**: Vertical position of the pivot point of rotation, in pixels, relative to the top left corner of the image. + - **src**: The ID of an existing image configuration, representing a needle pointing to the right like ``-o--->``. + - **value**: The value in the scale range to show at start. + - **line** (*Optional*): Add a needle line to the scale. By default, the length of the line is the same as the scale's radius: + - **color**: :ref:`Color ` for the needle line. Defaults to ``0`` (black). + - **id**: Manually specify the :ref:`config-id` used for updating the indicator value at runtime. + - **r_mod**: Adjust the length of the needle from the scale radius with this amount (can be negative). Defaults to ``0``. + - **value**: The value in the scale range to show at start. + - **width**: Needle line width in pixels. Defaults to ``4``. + - Style options for the *needle line* using the :ref:`lvgl-widget-line` style properties, as well as the background properties from :ref:`lvgl-styling` to draw a square (or circle) on the pivot of the needles. Padding makes the square larger. + - **tick_style** (**Optional**): Add tick style modifications: + - **color_end**: :ref:`Color ` for the gradient end of the ticks. + - **color_start**: :ref:`Color ` for the gradient start of the ticks. + - **end_value**: The value in the scale range to modify the ticks to. + - **local**: If ``true`` the ticks' color will be faded from ``color_start`` to ``color_end`` in the start and end values specified above. If ``false``, ``color_start`` and ``color_end`` will be mapped to the entire scale range (and only a *slice* of that color gradient will be visible in the indicator's start and end value range). Defaults to ``false``. + - **start_value**: The value in the scale range to modify the ticks from. + - **width**: Modifies the ``width`` of the tick lines. + - **range_from** (**Required**): The minimum value of the tick scale. Defaults to ``0``. + - **range_to** (**Required**): The maximum value of the tick scale. Defaults to ``100``. + - **rotation** (*Optional*): The rotation angle offset of the tick scale. + - **ticks** (**Required**, list): A scale can have minor and major ticks and labels on the major ticks. To add the minor ticks: + - **color** (*Optional*, :ref:`color `): Color to draw the ticks. Required if ``count`` is greater than ``0``. Defaults to ``0x808080``. + - **count** (**Required**): How many ticks to be on the scale. Defaults to ``12``. + - **length** (*Optional*): Tick line length in pixels. Required if ``count`` is greater than ``0``. Defaults to ``10``. + - **width** (*Optional*): Tick line width in pixels. Required if ``count`` is greater than ``0``. Defaults to ``2``. + - **major** (*Optional*, list): If you want major ticks and value labels displayed: + - **color**: :ref:`Color ` to draw the major ticks. Defaults to ``0`` (black). + - **label_gap**: Label distance from the ticks with text proportional to the values of the tick line. Defaults to ``4``. + - **length**: Tick line length in pixels or percentage. Defaults to ``15%``. + - **stride**: How many minor ticks to skip when adding major ticks. Defaults to ``3``. + - **width**: Tick line width in pixels. Defaults to ``5``. + - Style options from :ref:`lvgl-styling` for the tick *lines* and *labels* using the :ref:`lvgl-widget-line` and :ref:`lvgl-widget-label` text style properties. +- Style options from :ref:`lvgl-styling` for the background of the meter, using the typical background properties. + +.. note:: + + The zero degree position is at the middle right (3 o'clock) of the widget and the degrees increase in a clockwise direction from there. Angles are specified in the ``0``-``360`` range. + +**Actions:** + +- ``lvgl.indicator.update`` :ref:`action ` updates indicator options except ``src``, which cannot be updated at runtime. :ref:`lvgl.widget.update ` action can be used for the common styles, states or flags of the meter widget (not the indicators). + - **id** (**Required**): The ID or a list of IDs of line or image indicators which you want update. + +**Triggers:** + +- :ref:`interaction ` LVGL event triggers. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - meter: + align: center + scales: + range_from: -10 + range_to: 40 + angle_range: 240 + rotation: 150 + ticks: + count: 51 + length: 3 + major: + stride: 5 + length: 13 + label_gap: 13 + indicators: + - line: + id: temperature_needle + width: 2 + color: 0xFF0000 + r_mod: -4 + - tick_style: + start_value: -10 + end_value: 40 + color_start: 0x0000bd #FF0000 + color_end: 0xbd0000 #0000FF + + # Example action: + on_...: + then: + - lvgl.indicator.update: + id: temperature_needle + value: 3 + +.. _lvgl-widget-msgbox: + +``msgboxes`` +------------ + +The message boxes act as pop-ups. They are built from a background container, a title, an optional close button, a text and optional buttons. + +.. figure:: /components/lvgl/images/lvgl_msgbox.png + :align: center + +The text will be broken into multiple lines automatically and the height will be set automatically to include the text and the buttons. The message box is modal (blocks clicks on the rest of the screen until closed). + +**Configuration variables:** + +- **msgboxes** (*Optional*, dict): A list of message boxes to use. This option has to be added to the top level of the LVGL component configuration. + - **body** (**Required**, dict): The content of the body of the message box: + - **text** (**Required**, string): The string to be displayed in the body of the message box. Can be shorthanded if no further options are specified. + - Style options from :ref:`lvgl-styling`. Uses all the typical background properties and the text properties. + - **buttons** (**Required**, dict): A list of buttons to show at the bottom of the message box: + - **text** (**Required**, string): The text (or built-in :ref:`symbol ` codepoint) to display on the button. + - **close_button** (**Required**, boolean): Controls the appearance of the close button to the top right of the message box. + - **title** (**Required**, string): A string to display at the top of the message box. + +**Actions:** + +The configured message boxes are hidden by default. One can show them with ``lvgl.widget.show`` and ``lvgl.widget.hide`` :ref:`actions `. + +**Example:** + +.. code-block:: yaml + + # Example widget: + lvgl: + ... + msgboxes: + - id: message_box + close_button: true + title: Message box + body: + text: "This is a sample message box." + bg_color: 0x808080 + buttons: + - id: msgbox_apply + text: "Apply" + - id: msgbox_close + text: "\uF00D" + on_click: + then: + - lvgl.widget.hide: message_box + +.. tip:: + + You can create your own more complex dialogs with a full-screen sized, half-opaque ``obj`` with any child widgets on it, and the ``hidden`` flag set to ``true`` by default. For non-modal dialogs, simply set the ``clickable`` flag to ``false`` on it. + +.. _lvgl-widget-obj: + +``obj`` +------- + +The base object is just a simple, empty widget. By default, it's nothing more than a rounded rectangle: + +.. figure:: /components/lvgl/images/lvgl_baseobj.png + :align: center + +You can use it as a parent container for other widgets. By default, it catches touches. + +**Configuration variables:** + +- Style options from :ref:`lvgl-styling`. + +**Triggers:** + +- :ref:`interaction ` LVGL event triggers. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - obj: + x: 10 + y: 10 + width: 220 + height: 300 + widgets: + - ... + +.. _lvgl-widget-roller: + +``roller`` +---------- + +Roller allows you to simply select one option from a list by scrolling. + +.. figure:: /components/lvgl/images/lvgl_roller.png + :align: center + +**Configuration variables:** + +- **anim_time** (*Optional*, :ref:`Time `): When the Roller is scrolled and doesn't stop exactly on an option it will scroll to the nearest valid option automatically in this amount of time. +- **mode** (*Optional*, dict): Option to make the roller circular. ``NORMAL`` or ``INFINITE``, defaults to ``NORMAL``. +- **options** (**Required**, list): The list of available options in the roller. +- **selected_index** (*Optional*, int8): The index of the item you wish to be selected. +- **selected** (*Optional*, list): Settings for the selected *part* to show the value. Supports a list of :ref:`styles ` and state-based styles to customize. The selected option in the middle. Besides the typical background properties it uses the :ref:`lvgl-widget-label` text style properties to change the appearance of the text in the selected area. +- **visible_row_count** (*Optional*, int8): The number of visible rows. +- Style options from :ref:`lvgl-styling`. The background of the roller uses all the typical background properties and :ref:`lvgl-widget-label` style properties. ``text_line_space`` adjusts the space between the options. + +**Actions:** + +- ``lvgl.roller.update`` :ref:`action ` updates the widget styles and properties from the specific options above, just like the :ref:`lvgl.widget.update ` action is used for the common styles, states or flags. + - **id** (**Required**): The ID or a list of IDs of roller widgets which you want update. + - Widget styles or properties from the specific options above, which you want update. + +**Triggers:** + +- ``on_value`` :ref:`trigger ` is activated when you select an item from the list. The new selected index is returned in the variable ``x``. +- :ref:`interaction ` LVGL event triggers which also return the selected index in ``x``. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - roller: + align: CENTER + id: roller_id + options: + - Violin + - Piano + - Bassoon + - Chello + - Drums + + # Example action: + on_...: + then: + - lvgl.roller.update: + id: roller_id + selected_index: 4 + + # Example trigger: + - roller: + ... + on_value: + - logger.log: + format: "Selected index is: %d" + args: [ x ] + +The ``roller`` can be also integrated as :doc:`Select ` component. + +.. _lvgl-widget-slider: + +``slider`` +---------- + +The slider widget looks like a bar supplemented with a knob. The user can drag the knob to set a value. Just like bar, slider can be vertical or horizontal. The size of the indicator foreground and the knob position is set according to the current ``value`` of the slider. + +.. figure:: /components/lvgl/images/lvgl_slider.png + :align: center + +**Configuration variables:** + +- **anim_time** (*Optional*, :ref:`Time `): Sets the animation time if the value is set with ``animated: true``. +- **animated** (*Optional*, boolean): Animate the indicator when the bar changes value. Defaults to ``true``. +- **indicator** (*Optional*, list): Settings for the indicator *part* to show the value. Supports a list of :ref:`styles ` and state-based styles to customize. The indicator shows the current state of the slider. Also uses all the typical background style properties. +- **knob** (*Optional*, list): Settings for the knob *part* to control the value. Supports a list of :ref:`styles ` and state-based styles to customize. A rectangle (or circle) is drawn at the current value. Also uses all the typical background properties to describe the knob. By default, the knob is square (with an optional corner radius) with side length equal to the smaller side of the slider. The knob can be made larger with the padding values. Padding values can be asymmetric. +- **max_value** (*Optional*, int8): Maximum value of the indicator. Defaults to ``100``. +- **min_value** (*Optional*, int8): Minimum value of the indicator. Defaults to ``0``. +- **value** (**Required**, int8): Actual value of the indicator at start, in ``0``-``100`` range. Defaults to ``0``. +- Any :ref:`Styling ` and state-based option for the background of the slider. Uses all the typical background style properties. Padding makes the indicator smaller in the respective direction. + +Normally, the slider can be adjusted either by dragging the knob, or by clicking on the slider bar. In the latter case the knob moves to the point clicked and slider value changes accordingly. In some cases it is desirable to set the slider to react on dragging the knob only. This feature is enabled by enabling the ``adv_hittest`` flag. + +**Actions:** + +- ``lvgl.slider.update`` :ref:`action ` updates the widget styles and properties from the specific options above, just like the :ref:`lvgl.widget.update ` action is used for the common styles, states or flags. + - **id** (**Required**): The ID or a list of IDs of slider widgets which you want update. + - Widget styles or properties from the specific options above, which you want update. + +**Triggers:** + +- ``on_value`` :ref:`trigger ` is activated when the knob changes the value of the slider. The new value is returned in the variable ``x``. +- :ref:`interaction ` LVGL event triggers which also return the value in ``x``. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - slider: + x: 10 + y: 10 + width: 220 + id: slider_id + value: 75 + min_value: 0 + max_value: 100 + + # Example action: + on_...: + then: + - lvgl.slider.update: + id: slider_id + knob: + bg_color: 0x00FF00 + value: 55 + + # Example trigger: + - slider: + ... + on_value: + - logger.log: + format: "Slider value is: %.0f" + args: [ 'x' ] + +.. note:: + + The ``on_value`` trigger is sent as the slider is dragged or changed with keys. The event is sent *continuously* while the slider is being dragged; this generally has a negative effect on performance. To mitigate this, consider using a :ref:`universal interaction trigger ` like ``on_release``, to get the ``x`` variable once after the interaction has completed. + +The ``slider`` can be also integrated as :doc:`Number ` or :doc:`Sensor ` component. + +.. _lvgl-widget-spinbox: + +``spinbox`` +----------- + +The spinbox contains a numeric value (as text) which can be increased or decreased through actions. You can, for example, use buttons labeled with plus and minus to call actions which increase or decrease the value as required. + +.. figure:: /components/lvgl/images/lvgl_spinbox.png + :align: center + +**Configuration variables:** + +- **anim_time** (*Optional*, :ref:`Time `): Sets the cursor's blink time. +- **decimal_places** (*Optional*, 0..6): The number of digits after the decimal point. If ``0``, no decimal point is displayed. Defaults to ``0``. +- **digits** (*Optional*, 1..10): The number of digits (excluding the decimal separator and the sign characters). Defaults to ``4``. +- **range_from** (*Optional*, float): The minimum value allowed to set the spinbox to. Defaults to ``0``. +- **range_to** (*Optional*, float): The maximum value allowed to set the spinbox to. Defaults to ``100``. +- **rollover** (*Optional*, boolean): While increasing or decreasing the value, if either the minimum or maximum value is reached with this option enabled, the value will change to the other limit. If disabled, the value will remain at the minimum or maximum value. Defaults to ``false``. +- **step** (*Optional*, float): The granularity with which the value can be set. Defaults to ``1.0``. +- **value** (**Required**, float): Actual value to be shown by the spinbox at start. + +.. note:: + + The sign character will only be shown if the set range contains negatives. + +**Actions:** + +- ``lvgl.spinbox.update`` :ref:`action ` updates the widget styles and properties from the specific options above, just like the :ref:`lvgl.widget.update ` action is used for the common styles, states or flags. + - **id** (**Required**): The ID or a list of IDs of spinbox widgets which you want update. + - Widget styles or properties from the specific options above, which you want update. + +- ``lvgl.spinbox.increment`` :ref:`action ` increases the value by one ``step`` configured above. + - **id** (**Required**): The ID of the spinbox widget which you want to increment. + +- ``lvgl.spinbox.decrement`` :ref:`action ` decreases the value by one ``step`` configured above. + - **id** (**Required**): The ID of the spinbox widget which you want to decrement. + +**Triggers:** + +- ``on_value`` :ref:`trigger ` is activated when the knob changes the value of the arc. The new value is returned in the variable ``x``. +- :ref:`interaction ` LVGL event triggers which also return the value in ``x``. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - spinbox: + id: spinbox_id + text_align: center + range_from: -10 + range_to: 40 + step: 0.5 + digits: 3 + decimal_places: 1 + + # Example actions: + on_...: + then: + - lvgl.spinbox.decrement: spinbox_id + on_...: + then: + - lvgl.spinbox.update: + id: spinbox_id + value: 25.5 + + # Example trigger: + - spinbox: + ... + on_value: + then: + - logger.log: + format: "Spinbox value is %f" + args: [ x ] + +The ``spinbox`` can be also integrated as :doc:`Number ` or :doc:`Sensor ` component. + +.. _lvgl-widget-spinner: + +``spinner`` +----------- + +The Spinner widget is a spinning arc over a ring. + +.. figure:: /components/lvgl/images/lvgl_spinner.gif + :align: center + +**Configuration variables:** + +- **arc_color** (*Optional*, :ref:`color `): Color to draw the arcs. +- **arc_length** (**Required**, 0-360): Length of the spinning arc in degrees. +- **arc_opa** (*Optional*, :ref:`opacity `): Opacity of the arc. +- **arc_rounded** (*Optional*, boolean): Make the end points of the arcs rounded. ``true`` rounded, ``false`` perpendicular line ending. +- **arc_width** (*Optional*, int16): Set the width of the arcs in pixels. +- **indicator** (*Optional*, list): Settings for the indicator *part* to show the value. Supports a list of :ref:`styles ` and state-based styles to customize. Draws *another arc using the arc style* properties. Its padding values are interpreted relative to the background arc. +- **spin_time** (**Required**, :ref:`Time `): Duration of one cycle of the spin. + +**Actions:** + +- ``lvgl.spinner.update`` :ref:`action ` updates the widget styles and properties for the *indicator* part (anything other than the properties that apply commonly to all widgets), just like the :ref:`lvgl.widget.update ` action is used for the common styles, states or flags. + - **id** (**Required**): The ID or a list of IDs of spinner widgets which you want update. + - Widget styles or properties from the specific options above, which you want update. + +**Triggers:** + +- :ref:`interaction ` LVGL event triggers. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - spinner: + align: center + spin_time: 2s + arc_length: 60deg + id: spinner_id + indicator: + arc_color: 0xd4d4d4 + + # Example action: + on_...: + then: + - lvgl.spinner.update: + id: spinner_id + arc_color: 0x31de70 + +.. _lvgl-widget-switch: + +``switch`` +---------- + +The switch looks like a little slider and can be used to turn something on and off. + +.. figure:: /components/lvgl/images/lvgl_switch.png + :align: center + +**Configuration variables:** + +- **indicator** (*Optional*, list): Settings for the indicator *part*, the foreground area underneath the knob shown when the switch is in ``checked`` state. Supports a list of :ref:`styles ` and state-based styles to customize. +- **knob** (*Optional*, list): Settings for the knob *part* to control the value. Supports a list of :ref:`styles ` and state-based styles to customize. +- Style options from :ref:`lvgl-styling`. + +**Triggers:** + +- ``on_value`` :ref:`trigger ` is activated when toggling the switch. The boolean variable ``x``, representing the switch's state, may be used by lambdas within this trigger. +- :ref:`interaction ` LVGL event triggers which also return the value in ``x``. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - switch: + x: 10 + y: 10 + id: switch_id + + # Example trigger: + - switch: + ... + on_value: + then: + - logger.log: + format: "Switch state: %d" + args: [ x ] + +The ``switch`` can be also integrated as a :doc:`Switch ` component. + +.. _lvgl-widget-tabview: + +``tabview`` +----------- + +The tab view object can be used to organize content in tabs. The tab buttons are internally generated with a :ref:`lvgl-widget-buttonmatrix`. + +.. figure:: /components/lvgl/images/lvgl_tabview.png + :align: center + +The tabs are indexed (zero-based) in the order they appear in the configuration file. A new tab can be selected either by clicking on a tab button, by sliding horizontally on the content or via the ``lvgl.tabview.select`` :ref:`action `, specifying the tab's index. + +**Configuration variables:** + +- **position** (*Optional*, string): Position of the tab selector buttons. One of ``TOP``, ``BOTTOM``, ``LEFT``, ``RIGHT``. Defaults to ``TOP``. +- **size** (*Optional*, percentage): The height (in case of ``TOP``, ``BOTTOM``) or width (in case of ``LEFT``, ``RIGHT``) tab buttons. Defaults to ``10%``. +- **tabs** (**Required**, list): A list with (any number of) tabs to be added to tabview. + - **name** (**Required**): The text to be shown on the button corresponding to the tab. + - **id** (*Optional*): An ID for the tab itself. + - **widgets** (**Required**, list): A list of :doc:`/components/lvgl/widgets` to be drawn on the tab, as children. +- **tab_style** (*Optional*): Style settings for the tabs. + - **items** (*Optional*, list): Settings for the items *part*, the buttons all use the text and typical background style properties except translations and transformations. + +**Actions:** + +- ``lvgl.tabview.select`` :ref:`action ` jumps the view to the desired tab: + - **id** (**Required**): The ID of the tabview which receives this action. + - **index** (**Required**): The (zero-based) index of the tab to which to jump. + - **animated** (*Optional*, boolean): To animate the movement. Defaults to ``false``. + +**Triggers:** + +- ``on_value`` :ref:`trigger ` is activated when displayed tab changes. The new value is returned in the variable ``tab`` as the ID of the now-visible tab. +- :ref:`interaction ` LVGL event triggers. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - tabview: + id: tabview_id + position: top + tab_style: + border_color: 0x00FF00 + border_width: 6 + items: + text_color: 0x0000FF + tabs: + - name: Dog + id: tabview_tab_1 + widgets: + - image: + src: dog_img + ... + ... + + # Example action: + on_...: + then: + - lvgl.tabview.select: + id: tabview_id + index: 1 + animated: true + + # Example trigger: + - tabview: + ... + on_value: + then: + - if: + condition: + lambda: return tab == id(tabview_tab_1); + then: + - logger.log: "Dog tab is now showing" + +.. _lvgl-widget-textarea: + +``textarea`` +------------ + +The textarea is an extended label widget which displays a cursor and allows the user to input text. Long lines are wrapped and when the text becomes long enough the text area can be scrolled. It supports one line mode and password mode, where typed characters are replaced visually with bullets or asterisks. + +.. figure:: /components/lvgl/images/lvgl_textarea.png + :align: center + +**Configuration variables:** + +- **accepted_chars** (*Optional*, string): You can set a list of accepted characters, so other characters will be ignored. +- **max_length** (*Optional*, int): Limit the maximum number of characters to this value. +- **one_line** (*Optional*, boolean): The text area can be limited to only allow a single line of text. In this case the height will set automatically to fit only one line, line break characters will be ignored, and word wrap will be disabled. +- **password_mode** (*Optional*, boolean): The text area supports password mode. By default, if the ``•`` (bullet, ``0x2022``) glyph exists in the font, the entered characters are converted to it after some time or when a new character is entered. If ``•`` is missing from the font, ``*`` (asterisk) will be used. +- **placeholder_text** (*Optional*, string): A placeholder text can be specified, which is displayed when the Text area is empty. +- any :ref:`Styling ` and state-based option for the background of the textarea. Uses all the typical background style properties and the text/label related style properties for the text. + +**Actions:** + +- ``lvgl.textarea.update`` :ref:`action ` updates the widget's ``text`` property, to replace the entire text content. + - **id** (**Required**): The ID or a list of IDs of textarea widgets which you want update. + - **text** (**Required**): The new text content to be displayed. + +**Triggers:** + +- ``on_value`` :ref:`trigger ` is activated on every keystroke. +- ``on_ready`` :ref:`trigger ` is activated when ``one_line`` is configured as ``true`` and the newline character is received (Enter/Ready key on the keyboard). +- :ref:`interaction ` LVGL event triggers. + +For both triggers above, when triggered, the variable ``text`` (``std::string`` type) is available for use in lambdas within these triggers and it will contain the entire contents of the textarea. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - textarea: + id: textarea_id + one_line: true + placeholder_text: "Enter text here" + + # Example action: + on_...: + then: + - lvgl.textarea.update: + id: textarea_id + text: "Hello World!" + + # Example trigger: + - textarea: + ... + on_value: + then: + - logger.log: + format: "Textarea changed to: %s" + args: [ text.c_str() ] + on_ready: + then: + - logger.log: + format: "Textarea ready: %s" + args: [ text.c_str() ] + +The ``textarea`` can be also integrated as :doc:`Text ` or :doc:`Text Sensor ` component. + +.. _lvgl-widget-tileview: + +``tileview`` +------------ + +The tileview is a container object whose elements, called tiles, can be arranged in grid form. A user can navigate between the tiles by dragging or swiping. Any direction can be disabled on the tiles individually to not allow moving from one tile to another. + +If the Tile view is screen sized, the user interface resembles what you may have seen on smartwatches. + +**Configuration variables:** + +- **tiles** (**Required**, list): A list with (any number of) tiles to be added to tileview. + - **column** (**Required**): Vertical position of the tile in the tileview grid. + - **row** (**Required**): Horizontal position of the tile in the tileview grid. + - **dir** (*Optional*): Enable moving to adjacent tiles in the given direction by swiping/dragging. One (or multiple as YAML list) of ``LEFT``, ``RIGHT``, ``TOP``, ``BOTTOM``, ``HOR``, ``VER``, ``ALL``. Defaults to ``ALL``. + - **id** (*Optional*): A tile ID to be used with the ``lvgl.tileview.select`` action. + - **widgets** (*Optional*, list): A list of :doc:`/components/lvgl/widgets` to be drawn on the tile, as children. + +**Actions:** + +- ``lvgl.tileview.select`` :ref:`action ` jumps the ``tileview`` to the desired tile: + - **animated** (*Optional*, boolean): To animate the movement. Defaults to ``false``. + - **column** (*Optional*): Vertical position of the tile to which to jump. Required if not specifying ``tile_id``. + - **row** (*Optional*): Horizontal position of the tile to which to jump. Required if not specifying ``tile_id``. + - **id** (**Required**): The ID of the tileview which receives this action. + - **tile_id** (*Optional*): The ID of the tile (from within the tileview) to which to jump. Required if not specifying ``row`` and ``column``. + +**Triggers:** + +- ``on_value`` :ref:`trigger ` is activated when displayed tile changes. The new value is returned in the variable ``tile`` as the ID of the now-visible tile. +- :ref:`interaction ` LVGL event triggers. + +**Example:** + +.. code-block:: yaml + + # Example widget: + - tileview: + id: tiv_id + tiles: + - id: cat_tile + row: 0 + column: 0 + dir: VER + widgets: + - image: + src: cat_image + - ... + - ... + + # Example action: + on_...: + then: + - lvgl.tileview.select: + id: tiv_id + tile_id: cat_tile + animated: true + + # Example trigger: + - tileview: + ... + on_value: + - if: + condition: + lambda: return tile == id(cat_tile); + then: + - logger.log: "Cat tile is now showing" + +.. _lvgl-automations: + +Automations +----------- + +.. _lvgl-automation-actions: + +Actions +******* + +As outlined in the sections above, each widget type supports several of its own, unique actions. +Several universal actions are also available for all widgets, these are outlined below. + +``lvgl.widget.update`` +^^^^^^^^^^^^^^^^^^^^^^ + +This powerful :ref:`action ` allows changing/updating any widget's common :ref:`style property `, state (templatable) or :ref:`flag ` on the fly. + +- **id** (**Required**): The ID or a list of IDs of widgets configured in LVGL which you want update. +- The widget's common :ref:`style property `, state (templatable) or :ref:`flag `. + +.. code-block:: yaml + + # Example for updating styles (in states): + on_...: + then: + - lvgl.widget.update: + id: my_button_id + bg_color: 0xFF0000 + state: + disabled: true + + # Example for updating flag: + on_...: + then: + - lvgl.widget.update: + id: my_label_id + hidden: true + + +.. _lvgl-automation-shorthands: + +``lvgl.widget.hide``, ``lvgl.widget.show`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +These :ref:`actions ` are shorthands for toggling the ``hidden`` :ref:`flag ` of any widget. + +- **id** (**Required**): The ID or a list of IDs of widgets configured in LVGL which you want to hide or show. + +.. code-block:: yaml + + on_...: + then: + - lvgl.widget.hide: my_label_id # a single widget + - lvgl.widget.show: [my_button_1, my_button_2] # a list of widgets + - delay: 0.5s + - lvgl.widget.show: + -id: my_label_id + - lvgl.widget.hide: + - id: [my_button_1, my_button_2] + +``lvgl.widget.disable``, ``lvgl.widget.enable`` +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +These :ref:`actions ` are shorthands for toggling the ``disabled`` state of any widget (which controls the appearance of the corresponding *disabled* style set of the theme): + +- **id** (**Required**): The ID or a list of IDs of widgets configured in LVGL which you want to disable or enable. + +.. code-block:: yaml + + - on_...: + then: + - lvgl.widget.disable: + - my_button_1 + - my_button_2 + + - on_...: + then: + - lvgl.widget.enable: + - id: my_button_1 + - id: my_button_2 + +.. _lvgl-automation-triggers: + +Triggers +******** + +Specific triggers like ``on_value`` are available for certain widgets; they are described above in their respective section. +Some universal triggers are also available for all of the widgets: + +ESPHome implements as universal triggers the following interaction events generated by LVGL: + +- ``on_press``: The widget has been pressed. +- ``on_long_press``: The widget has been pressed for at least the ``long_press_time`` specified in the input device configuration. Not called if scrolled. +- ``on_long_press_repeat``: Called after ``long_press_time`` in every ``long_press_repeat_time`` ms. Not called if scrolled. +- ``on_short_click``: The widget was pressed for a short period of time, then released. Not called if scrolled or long pressed. +- ``on_click``: Called on release if a widget did not scroll (regardless of long press). +- ``on_release``: Called in every case when a widget has been released. +- ``on_scroll_begin``: Scrolling of the widget begins. +- ``on_scroll_end``: Scrolling of the widget ends. +- ``on_scroll``: The widget was scrolled. +- ``on_focus``: The widget is focused. +- ``on_defocus``: The widget is unfocused. + +These triggers can be applied directly to any widget in the LVGL configuration, *given that the widget itself supports generating such events*. For the widgets having a value, the triggers return the current value in variable ``x``; this variable may be used in lambdas defined within those triggers. + +.. code-block:: yaml + + # Example triggers: + - button: + ... + on_short_click: + then: + lvgl.page.show: main_page + on_long_press: + then: + light.toggle: display_backlight + + - slider: + ... + on_release: + then: + - light.turn_on: + id: display_backlight + transition_length: 0ms + brightness: !lambda return x / 100; + +See Also +-------- + +- :doc:`LVGL Main component ` +- :doc:`/components/binary_sensor/lvgl` +- :doc:`/components/sensor/lvgl` +- :doc:`/components/number/lvgl` +- :doc:`/components/switch/lvgl` +- :doc:`/components/select/lvgl` +- :doc:`/components/light/lvgl` +- :doc:`/components/text/lvgl` +- :doc:`/components/text_sensor/lvgl` +- `LVGL docs `__ +- :ghedit:`Edit` diff --git a/components/number/lvgl.rst b/components/number/lvgl.rst new file mode 100644 index 000000000..0183592cc --- /dev/null +++ b/components/number/lvgl.rst @@ -0,0 +1,47 @@ +LVGL Number +=========== + +.. seo:: + :description: Instructions for setting up an LVGL widget number component. + :image: ../images/lvgl_c_num.png + +The ``lvgl`` number platform creates a number component from an LVGL widget +and requires :doc:`LVGL ` to be configured. + +Supported widgets are :ref:`lvgl-widget-arc`, :ref:`lvgl-widget-bar`, :ref:`lvgl-widget-slider` and :ref:`lvgl-widget-spinbox`. A single number supports only a single widget; in other words, it's not possible to have multiple widgets associated with a single ESPHome number component. + +Configuration variables: +------------------------ + +- **widget** (**Required**): The ID of a supported widget configured in LVGL, which will reflect the state of the number. +- **animated** (*Optional*, boolean): Whether to set the value of the widget with an animation (if supported by the widget). Defaults to ``true``. +- All other variables from :ref:`Number `. + +Example: + +.. code-block:: yaml + + number: + - platform: lvgl + widget: slider_id + name: LVGL Slider + +.. note:: + + Widget-specific actions (``lvgl.arc.update``, ``lvgl.bar.update``, ``lvgl.slider.update``, ``lvgl.spinbox.update``, ``lvgl.spinbox.decrement``, ``lvgl.spinbox.increment``) will trigger correspponding component updates to be sent to Home Assistant. + +See Also +-------- +- :doc:`LVGL Main component ` +- :ref:`Arc widget ` +- :ref:`Bar widget ` +- :ref:`Slider widget ` +- :ref:`Spinbox widget ` +- :doc:`/components/binary_sensor/lvgl` +- :doc:`/components/sensor/lvgl` +- :doc:`/components/switch/lvgl` +- :doc:`/components/select/lvgl` +- :doc:`/components/light/lvgl` +- :doc:`/components/text/lvgl` +- :doc:`/components/text_sensor/lvgl` +- :ghedit:`Edit` diff --git a/components/select/lvgl.rst b/components/select/lvgl.rst new file mode 100644 index 000000000..711c2509d --- /dev/null +++ b/components/select/lvgl.rst @@ -0,0 +1,44 @@ +LVGL Select +=========== + +.. seo:: + :description: Instructions for setting up an LVGL widget select. + :image: ../images/lvgl_c_sel.png + +The ``lvgl`` select platform creates a select from an LVGL widget +and requires :doc:`LVGL ` to be configured. + +Supported widgets are :ref:`lvgl-widget-dropdown` and :ref:`lvgl-widget-roller`. A single select supports only a single widget; in other words, it's not possible to have multiple widgets associated with a single ESPHome select component. + +Configuration variables: +------------------------ + +- **widget** (**Required**): The ID of a supported widget configured in LVGL, which will reflect the state of the select. +- All other variables from :ref:`Select `. + +Example: + +.. code-block:: yaml + + select: + - platform: lvgl + widget: dropdown_id + name: LVGL Dropdown + +.. note:: + + Widget-specific actions (``lvgl.dropdown.update``, ``lvgl.roller.update``) will trigger correspponding component updates to be sent to Home Assistant. + +See Also +-------- +- :doc:`LVGL Main component ` +- :ref:`Roller widget ` +- :ref:`Dropdown widget ` +- :doc:`/components/binary_sensor/lvgl` +- :doc:`/components/sensor/lvgl` +- :doc:`/components/number/lvgl` +- :doc:`/components/switch/lvgl` +- :doc:`/components/light/lvgl` +- :doc:`/components/text/lvgl` +- :doc:`/components/text_sensor/lvgl` +- :ghedit:`Edit` diff --git a/components/sensor/lvgl.rst b/components/sensor/lvgl.rst new file mode 100644 index 000000000..b7c13e252 --- /dev/null +++ b/components/sensor/lvgl.rst @@ -0,0 +1,46 @@ +LVGL Sensor +=========== + +.. seo:: + :description: Instructions for setting up an LVGL widget sensor component. + :image: ../images/lvgl_c_num.png + +The ``lvgl`` sensor platform creates a semsor component from an LVGL widget +and requires :doc:`LVGL ` to be configured. + +Supported widgets are :ref:`lvgl-widget-arc`, :ref:`lvgl-widget-bar`, :ref:`lvgl-widget-slider` and :ref:`lvgl-widget-spinbox`. A single sensor supports only a single widget; in other words, it's not possible to have multiple widgets associated with a single ESPHome sensor. + +Configuration variables: +------------------------ + +- **widget** (**Required**): The ID of a supported widget configured in LVGL, which will reflect the state of the sensor. +- All other variables from :ref:`Sensor `. + +Example: + +.. code-block:: yaml + + sensor: + - platform: lvgl + widget: slider_id + name: LVGL Slider + +.. note:: + + Widget-specific actions (``lvgl.arc.update``, ``lvgl.bar.update``, ``lvgl.slider.update``, ``lvgl.spinbox.update``, ``lvgl.spinbox.decrement``, ``lvgl.spinbox.increment``) will trigger correspponding component updates to be sent to Home Assistant. + +See Also +-------- +- :doc:`LVGL Main component ` +- :ref:`Arc widget ` +- :ref:`Bar widget ` +- :ref:`Slider widget ` +- :ref:`Spinbox widget ` +- :doc:`/components/binary_sensor/lvgl` +- :doc:`/components/switch/lvgl` +- :doc:`/components/select/lvgl` +- :doc:`/components/light/lvgl` +- :doc:`/components/number/lvgl` +- :doc:`/components/text/lvgl` +- :doc:`/components/text_sensor/lvgl` +- :ghedit:`Edit` diff --git a/components/switch/lvgl.rst b/components/switch/lvgl.rst new file mode 100644 index 000000000..37a0478c2 --- /dev/null +++ b/components/switch/lvgl.rst @@ -0,0 +1,42 @@ +LVGL Switch +=========== + +.. seo:: + :description: Instructions for setting up an LVGL widget switch. + :image: ../images/lvgl_c_swi.png + +The ``lvgl`` switch platform creates a switch from an LVGL widget +and requires :doc:`LVGL ` to be configured. + +Supported widgets are :ref:`lvgl-widget-button` (with ``checkable`` option enabled), :ref:`lvgl-widget-switch` and :ref:`lvgl-widget-checkbox`. A single switch supports only a single widget; in other words, it's not possible to have multiple widgets associated with a single ESPHome switch component. + +Configuration variables: +------------------------ + +- **widget** (**Required**): The ID of a supported widget configured in LVGL, which will reflect the state of the switch. +- All other variables from :ref:`Switch `. + +Example: + +.. code-block:: yaml + + switch: + - platform: lvgl + widget: checkbox_id + name: LVGL switch + +See Also +-------- +- :doc:`LVGL Main component ` +- :ref:`Button widget ` +- :ref:`Switch widget ` +- :ref:`Checkbox widget ` +- :doc:`/components/binary_sensor/lvgl` +- :doc:`/components/sensor/lvgl` +- :doc:`/components/number/lvgl` +- :doc:`/components/select/lvgl` +- :doc:`/components/light/lvgl` +- :doc:`/components/text/lvgl` +- :doc:`/components/text_sensor/lvgl` +- :doc:`/components/output/index` +- :ghedit:`Edit` diff --git a/components/text/lvgl.rst b/components/text/lvgl.rst new file mode 100644 index 000000000..78b16e11e --- /dev/null +++ b/components/text/lvgl.rst @@ -0,0 +1,43 @@ +LVGL Text +========= + +.. seo:: + :description: Instructions for setting up an LVGL Text component. + :image: ../images/lvgl_c_txt.png + +The ``lvgl`` text platform creates an editable text component from an LVGL textual widget and requires :doc:`LVGL ` to be configured. + +Supported widgets are :ref:`lvgl-widget-label` and :ref:`lvgl-widget-textarea`. A single text supports only a single widget; in other words, it's not possible to have multiple widgets associated with a single ESPHome text component. + +Configuration variables: +------------------------ + +- **widget** (**Required**): The ID of a ``textarea`` widget configured in LVGL, which will reflect the state of the text component. +- All other variables from :ref:`Text `. + +Example: + +.. code-block:: yaml + + text: + - platform: lvgl + widget: textarea_id + name: "Textarea 1 text" + +.. note:: + + Widget-specific actions (``lvgl.label.update``, ``lvgl.textarea.update``) will trigger correspponding component updates to be sent to Home Assistant. + +See Also +-------- +- :doc:`LVGL Main component ` +- :ref:`Label widget ` +- :ref:`Textarea widget ` +- :doc:`/components/binary_sensor/lvgl` +- :doc:`/components/sensor/lvgl` +- :doc:`/components/number/lvgl` +- :doc:`/components/switch/lvgl` +- :doc:`/components/light/lvgl` +- :doc:`/components/select/lvgl` +- :doc:`/components/text_sensor/lvgl` +- :ghedit:`Edit` diff --git a/components/text_sensor/lvgl.rst b/components/text_sensor/lvgl.rst new file mode 100644 index 000000000..61610f423 --- /dev/null +++ b/components/text_sensor/lvgl.rst @@ -0,0 +1,44 @@ +LVGL Text Sensor +================ + +.. seo:: + :description: Instructions for setting up an LVGL Text Sensor. + :image: ../images/lvgl_c_txt.png + +The ``lvgl`` text sensor platform creates a Text Sensor from an LVGL textual widget +and requires :doc:`LVGL ` to be configured. + +Supported widgets are :ref:`lvgl-widget-label` and :ref:`lvgl-widget-textarea`. A single text sensor supports only a single widget; in other words, it's not possible to have multiple widgets associated with a single ESPHome text sensor component. + +Configuration variables: +------------------------ + +- **widget** (**Required**): The ID of a ``textarea`` widget configured in LVGL, which will reflect the state of the text sensor. +- All other variables from :ref:`Text Sensor `. + +Example: + +.. code-block:: yaml + + text_sensor: + - platform: lvgl + widget: textarea_id + name: "Textarea 1 text" + +.. note:: + + Widget-specific actions (``lvgl.label.update``, ``lvgl.textarea.update``) will trigger correspponding component updates to be sent to Home Assistant. + +See Also +-------- +- :doc:`LVGL Main component ` +- :ref:`Label widget ` +- :ref:`Textarea widget ` +- :doc:`/components/binary_sensor/lvgl` +- :doc:`/components/sensor/lvgl` +- :doc:`/components/number/lvgl` +- :doc:`/components/switch/lvgl` +- :doc:`/components/light/lvgl` +- :doc:`/components/select/lvgl` +- :doc:`/components/text/lvgl` +- :ghedit:`Edit` diff --git a/images/lvgl.png b/images/lvgl.png new file mode 100644 index 0000000000000000000000000000000000000000..a48dd7c4f8f569bb154d6365c0bd6d792e578b6d GIT binary patch literal 3401 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 literal 0 HcmV?d00001 diff --git a/images/lvgl_c_txt.png b/images/lvgl_c_txt.png new file mode 100644 index 0000000000000000000000000000000000000000..72f1d05113a88968343a9c2f48a9c14ffc658a7f GIT binary patch literal 1623 zcma)-e>f8e7{^zR6H`RD{Qgm+2&=n($Q{MVa9h@@GZSIUjfL|ohf-@y+fGW!uV~#u zWPXI1q5Rm&5}TCTQqdSKEH(`1cF%LqbN4*=&;9Yf-{*PX=Y5~|{p0<-*+=0=^mI&g z004j<%m<28D_dRj>Xx9*WaN6fyS z4e`}To(0ZW5s!ySi5s)6^-~(qAlZYxeP28tCrLv+@8tSqR+zKVf`J{BT%=E|4nej{ zusIyNV@GIh1GvP)nzWyV^3+&(v}yWqX2Q8E^U*E!&)q&DR#yFmE;Azq%TsAHZG#e{ zwsb#0$x_)Xy^O<`SQ(j{7C5CR?addnYwc(k-H_p^df9R@PZ!ZM;gs{czovCV!Pd>e zF&6WnmTjKy;`(8%0O&cFBj6w_tsZ6(A~eZ9zzwOxaLo@KB&`#N5nk+%<|5`+erM1Q z|4j|IE((nr?{-3fp4FqWecY|#)J^7mHh3;Bz;}tcN?bEH%aIfjlo? zV=aXNDUiAw$LSf!MA`$pDs)#~osT4W+`@dp?Qx=2Lns9VZ~{60xr<%E3gTr`Ci-6J0bdIAv)m)vc}^Q(!UlnO zab~>9Hl(+#D(~(uQ^*WrM1%Kvs8lU}oMR527{pYl9W1U?_e7(a8y25`4cBBYwjPS-8OBLchS5X1CBRgnQjTg*v_6N1lS)E=DzjtUNs=Xb^R96eSyzji zJ(Ut4((fhdY4u9x{s^?|&EXHx@Tgnug*Da3znP;*coKQGoU}xm8pLz%_oBh8!R)R( zQSaWU#}*s!pCe?FIRs{G)lrPSjFY0aHymC}#h5o3uj3`asn+8eG+T=?FOKIvR;3br3sP~8gr zliCaE=>+vs3)hOa!i~O=Haet*C~(ulr7WaYeIMeL!zV#GXK3w)CA}#!CD(EhS%`UZ zfUJs|7Piz;!l9_ZDsr+^o6_*+g)QS5h9A+uSerssbgyxo*tj{i$|}9U1ToYUwLj*qINsnz%f3cz&6#UYBUJcblW@wx zes{;WI~mM-L85pM?~)P!M9?^B6g*8$egE*$YHzwy7N|tu3=#(>Ue+h2J$Ct2z0y>l z7E=(ErY?>R%$5ZOO~NO8D4-(KBIx$ZKRt8CF|j;5F3*YD*fcRvZei88X86AJGdgU0 z91D#X?X|&QScJ8D3EU4(mMF6>%uf#=E@?f4_~)9XBR33eTV~c#oys0ZV1VZnP5pO^ zcH&0ElvTfkUVZI+%Y^2a!J02o{pOm!C7%nAL^h>n0E1sjHy#TbGA?R0WZ2@;IZ-y-^_BLzS(2pSRUAp?(A6P