Integrar el MaTouch ESP32-S3 Rotary 2.1" en HA

Integrar el MaTouch ESP32-S3 Rotary 2.1″ en HA

En esta entrada te traigo una pantalla muy interesante para manejar tus dispositivos, vamos a integrar el MaTouch ESP32-S3 Rotary 2.1″ en HA.

MaTouch ESP32-S3 Rotary 2,1″

Esta pantalla fabricada por Makerfabs es un dispositivos muy popular. Se trata de una pantalla ST7701 táctil circular de 2,1″ (480×480 pixels), RGB, con una tasa de refresco de 75 FPS y una resolución de color de 65K. Además del control táctil, nos permite navegar con ella con el encoder que trae alrededor y un botón al pulsar la pantalla. Personalmente me recuerda mucho al Google Nest Thermostat, sólo que mucho más barato 😅.

Además funciona sobre una placa ESP32-S3, con 8 MB de PSRAM y 16 MB de memoria flash integrada, por lo que podemos integrarla con ESPHome y hacer muchas más cosas. Tiene Wi-Fi y Bluetooth 5.0 por lo que, entre otras, podemos usarla como Bluetooth Proxy con Bermuda. Se alimenta con un cable USB-C y tiene dos conectores de expansión (I2C y UART), por lo que puedes añadir sensores externos.

Requisitos previos

Para integrar el MaTouch ESP32-S3 Rotary 2.1″ en HA previamente necesitas:

Configuración en ESPHome

Sigue estos pasos para integrar el MaTouch ESP32-S3 Rotary 2.1″ en HA:

  1. En Home Assistant, ve a tu complemento de ESPHome, pulsa en “New device” y “Continue”.
  2. Dale un nombre a tu dispositivo (por ejemplo, “MaTouch Rotary ST7701”) y pulsa en “Next”.
  3. Como tipo de dispositivo selecciona “ESP32-S3”. Observarás de fondo que se ha creado un nuevo bloque para tu dispositivo.
  4. Pulsa en “Skip” y haz clic en “Edit”, sobre el bloque de tu dispositivo. Copia el código que aparece y consérvalo, ya que vas a necesitar alguna parte del mismo.
  5. Copia el siguiente código y úsalo para reemplazar el código anterior en ESPHome.
substitutions:
  name: "matouch-rotary-st7701"
  friendly_name: "MaTouch Rotary ST7701"
esphome:
  name: "${name}"
  friendly_name: "${friendly_name}"
  min_version: 2024.11.0
  name_add_mac_suffix: false
  platformio_options:
    board_build.flash_mode: dio
    board_build.arduino.memory_type: qio_opi
    build_flags: "-DBOARD_HAS_PSRAM"
    board_upload.maximum_ram_size: 524288
esp32:
  board: esp32-s3-devkitc-1
  flash_size: 16MB
  framework:
    type: esp-idf
    version: recommended
    sdkconfig_options:
      CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: y
      CONFIG_ESP32S3_DATA_CACHE_64KB: y
      CONFIG_SPIRAM_FETCH_INSTRUCTIONS: y
      CONFIG_SPIRAM_RODATA: y
psram:
  speed: 80MHz
  mode: octal
# Enable logging
logger:
  level: DEBUG 
debug:
  update_interval: 30s
# Enable Home Assistant API
api:
  encryption:
    key: "k522xpMnuyqLiQDfjzNs40UMIJJATLY7NdAkP4GrJnE="
# Allow Over-The-Air updates
ota:
  - platform: esphome
    password: "9a95fbbd5964f3eb28c043ee1fb641d4"
mdns:
  disabled: false
  
wifi:
  power_save_mode: none
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Matouch-Rotary-St7701"
    password: "TbK3wh8IPTC0"
external_components:
  - source: github://sEbola76/Makerfabs
    components: [ cst826 ]
captive_portal:
binary_sensor:
  - platform: gpio
    name: Button
    id: front_button
    pin: 
      number: GPIO14
      inverted: true
i2c:
  - id: i2c_bus
    sda: 17
    scl: 18
    scan: true
    frequency: 400kHz
light:
  - platform: monochromatic
    name: "Backlight"
    output: backlight_output
    id: display_backlight
    restore_mode: ALWAYS_ON
    
output:
  - platform: ledc
    pin: GPIO38
    id: backlight_output
sensor:
  - platform: rotary_encoder
    id: encoder
    pin_a: GPIO10
    pin_b: GPIO13
spi:
  id: spi_bus
  mosi_pin: GPIO0
  clk_pin: GPIO46
time:
  - platform: homeassistant
    id: esptime
touchscreen:
  platform: cst826
  id: touch
  #interrupt_pin: GPIO40
  #reset_pin: GPIO16
  i2c_id: i2c_bus
  skip_probe: True
  update_interval: 25ms
  #touch_timeout: 5ms
  on_touch:
    - logger.log:
        format: Touch at (%d, %d)
        args: [touch.x, touch.y]
    - lambda: |-
        ESP_LOGI("cal", "x=%d, y=%d, x_raw=%d, y_raw=%0d",
            touch.x,
            touch.y,
            touch.x_raw,
            touch.y_raw
            );
display:
  - platform: st7701s
    id: round_display
    auto_clear_enabled: false
    color_order: rgb
    data_rate: 10MHz
    spi_mode: MODE3
    dimensions:
      width: 480
      height: 480
    cs_pin: GPIO1
    #reset_pin: GPIO
    de_pin: GPIO2
    hsync_pin: GPIO3
    vsync_pin: GPIO42
    pclk_pin: GPIO45
    pclk_frequency: 12MHz
    pclk_inverted: false
    hsync_front_porch: 10
    hsync_pulse_width: 8
    hsync_back_porch: 50
    vsync_front_porch: 10
    vsync_pulse_width: 8
    vsync_back_porch: 20
    data_pins:
      red:
        - 11        #r1
        - 15        #r2
        - 12        #r3
        - 16        #r4
        - 21        #r5
      green:
        - 39        #g0
        - 07        #g1
        - 47        #g2
        - 08        #g3
        - 48        #g4
        - 09        #g5
      blue:
        - 04        #b1
        - 41        #b2
        - 05        #b3
        - 40        #b4
        - 06        #b5
    init_sequence:
      - [0x01]
      - delay 120ms
      - [0xFF, 0x77, 0x01, 0x00, 0x00, 0x10]
      - [0xC0, 0x3B, 0x00]
      - [0xC1, 0x0B, 0x02]
      - [0xC2, 0x00, 0x02]
      - [0xCC, 0x10]
      - [0xCD, 0x08]
      - [0xB0, 0x02, 0x13, 0x1B, 0x0D, 0x10, 0x05, 0x08, 0x07, 0x07, 0x24, 0x04, 0x11, 0x0E, 0x2C, 0x33, 0x1D]
      - [0xB1, 0x05, 0x13, 0x1B, 0x0D, 0x11, 0x05, 0x08, 0x07, 0x07, 0x24, 0x04, 0x11, 0x0E, 0x2C, 0x33, 0x1D]
      - [0xFF, 0x77, 0x01, 0x00, 0x00, 0x11]
      - [0xB0, 0x5d]
      - [0xB1, 0x43]
      - [0xB2, 0x81]
      - [0xB3, 0x80]
      - [0xB5, 0x43]
      - [0xB7, 0x85]
      - [0xB8, 0x20]
      - [0xC1, 0x78]
      - [0xC2, 0x78]
      - [0xD0, 0x88]
      - [0xE0, 0x00, 0x00, 0x02]
      - [0xE1, 0x03, 0xA0, 0x00, 0x00, 0x04, 0xA0, 0x00, 0x00, 0x00, 0x20, 0x20]
      - [0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
      - [0xE3, 0x00, 0x00, 0x11, 0x00]
      - [0xE4, 0x22, 0x00]
      - [0xE5, 0x05, 0xEC, 0xA0, 0xA0, 0x07, 0xEE, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
      - [0xE6, 0x00, 0x00, 0x11, 0x00]
      - [0xE7, 0x22, 0x00]
      - [0xE8, 0x06, 0xED, 0xA0, 0xA0, 0x08, 0xEF, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
      - [0xEB, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00]
      - [0xEd, 0xFF, 0xFF, 0xFF, 0xBA, 0x0A, 0xBF, 0x45, 0xFF, 0xFF, 0x54, 0xFB, 0xA0, 0xAB, 0xFF, 0xFF, 0xFF]
      - [0xEF, 0x10, 0x0D, 0x04, 0x08, 0x3F, 0x1F]
      - [0xFF, 0x77, 0x01, 0x00, 0x00, 0x13]
      - [0xEF, 0x08]
      - [0xFF, 0x77, 0x01, 0x00, 0x00, 0x00]
      - [0x36, 0x08]
      - [0x3A, 0x60]
      - [0x11]
      - delay 100ms
      - [0x29]
      - delay 50ms
lvgl:
  displays:
    - round_display
  touchscreens:
    - touch
  encoders:
    sensor: encoder
    enter_button: front_button
  buffer_size: 100%
  widgets:
    - label:
        align: CENTER
        id: lbl_title
        text_font: montserrat_28
        text: "Aguacatec"
  1. Parte importante. En este código no se han incluido las credenciales para que el dispositivo se conecte a tu WiFi y tu instancia de Home Assistant y tienes que incluirlas manualmente. En concreto me refiero a las siguientes líneas del código que has copiado en el paso 4.
# Enable Home Assistant API
api:
  encryption:
    key: "bg6hash6sjdjsdjk02hh0qnQeYVwm123vdfKE8BP5"
ota:
  - platform: esphome
    password: "asddasda27aab65a48484502b332f"
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Assist Fallback Hotspot"
    password: "ZsasdasdHGP2234"
  1. Lo que tienes que hacer es, encontrar las líneas correspondientes en el código (está al principio) y añadir la información correspondiente.
  2. Ahora sí, pulsa en “Save” e “Install”. Selecciona “Manual download” y espera a que se compile el código. 
  3. Cuando termine, selecciona la opción “Modern format” para descargar el fichero ‘.bin’ correspondiente.
  4. Conecta el Matouch Rotary con el cable USB-C de datos por el puerto que trae en la parte posterior a tu ordenador.
  5. Ahora ve a la página de ESPHome y pulsa en “Connect”. En la ventana emergente selecciona tu placa y pulsa en “Conectar”.
  6. Ahora pulsa en “Install” y selecciona el fichero ‘.bin’ obtenido en el paso 9. De nuevo, pulsa en “Install”.
  7. Vuelve a Home Assistant y ve a Configuración > Dispositivos y servicios. Lo normal es que tu dispositivo haya sido descubierto y aparezca en la parte superior, esperando únicamente a que pulses el botón de “Configurar”. De lo contrario pulsa en el botón de “Añadir integración”, busca “ESPHome” e introduce la IP de tu placa en el campo ‘Host’.  Como siempre, te recomiendo que asignes una IP fija en tu router para evitar fallos en el futuro si esta cambia.
  8. Para terminar ve a Configuración > Dispositivos y servicios > ESPHome. Pulsa sobre el enlace «Configurar» correspondiente tu dispositivo. En la ventana emergente marca la casilla «Permitir que el dispositivo realice acciones de Home Assistant» y pulsa en «Enviar». Esto va a permitir que podamos controlar nuestros dispositivos desde la pantalla.

Si todo ha ido bien, deberías estar viendo lo siguiente:

Código del Radar de Dragon Ball

Como seguro que ya te has imaginado, no podíamos dejar así este tremendo dispositivo. He creado un código de ejemplo para que puedas controlar tus dispositivos. Además he aprovechado para alimentar nuestro espíritu «friki» y convertirlo en el radar de Dragon Ball 😁

A continuación te dejo el código completo para que lo adaptes como quieras, así como el enlace al soporte que he diseñado.

substitutions:
# Device customization
# Personalización del dispositivo
  name: "matouch-rotary-st7701"
  friendly_name: "MaTouch Rotary ST7701"
# Example of Devices
# Ejemplo de Dispositivos
  device1: light.tira_led_escritorio
  device1_name: "Lámpara"
  device1_brightness: sensor.light_brightness
  device2: climate.salon
  device2_name: "Calefacción"
  device2_temperature: sensor.climate_temperature
  device3: switch.impresora_3d
  device3_name: "Ventilador"
  device4: switch.impresora_3d
  device4_name: "Impresora"
# Other settings
# Otros ajustes
  allowed_characters: " ¿?¡!#%'()+,-./:°0123456789ABCDEFGHIJKLMNOPQRSTUVWYZabcdefghijklmnopqrstuvwxyzáéíóú"
################################################################################################################
esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  min_version: 2024.11.0
  name_add_mac_suffix: false
  platformio_options:
    board_build.flash_mode: dio
    board_build.arduino.memory_type: qio_opi
    build_flags: "-DBOARD_HAS_PSRAM"
    board_upload.maximum_ram_size: 524288
esp32:
  board: esp32-s3-devkitc-1
  flash_size: 16MB
  framework:
    type: esp-idf
    version: recommended
    sdkconfig_options:
      CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: y
      CONFIG_ESP32S3_DATA_CACHE_64KB: y
      CONFIG_SPIRAM_FETCH_INSTRUCTIONS: y
      CONFIG_SPIRAM_RODATA: y
psram:
  speed: 80MHz
  mode: octal
# Enable logging
logger:
  level: DEBUG 
debug:
  update_interval: 30s
# Enable Home Assistant API
api:
  encryption:
    key: "k522xpMadsasdJATLY7NdA879as"
# Allow Over-The-Air updates
ota:
  - platform: esphome
    password: "9a95fads935erfdfd212e1fb"
mdns:
  disabled: false
  
wifi:
  power_save_mode: none
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Matouch-Rotary-St7701"
    password: "2134K3wasd"
external_components:
  - source: github://sEbola76/Makerfabs
    components: [ cst826 ]
captive_portal:
binary_sensor:
  - platform: gpio
    name: Button
    id: front_button
    internal: true
    pin: 
      number: GPIO14
      inverted: true
    on_press:
      then:
      - lvgl.page.show: page_home
      - light.turn_on: display_backlight
      - if:
          condition:
            light.is_on: display_backlight
          then:
          - if:
              condition:
                lambda: |-
                  return id(device_menu).state == "${device1_name}";
              then:
              - homeassistant.action:
                  service: light.toggle
                  data:
                    entity_id: ${device1}
              - delay: 1s
              - lvgl.label.update:
                  id: lbl_device_state
                  text: !lambda |-
                      if (id(device_1).state == "off") {
                        return "Apagada";
                      } else {
                        return (std::to_string((int)id(light_brightness).state) + "%").c_str();
                      }
              - if:
                  condition:
                    lambda: |-
                      return id(device_1).state == "on";
                  then:
                    - lvgl.widget.show:
                        - id: arc_light
                  else:
                    - lvgl.widget.hide:
                        - id: arc_light
          - if:
              condition:
                lambda: |-
                  return id(device_menu).state == "${device2_name}";
              then:
              - homeassistant.action:
                  service: climate.toggle
                  data:
                    entity_id: ${device2}
              - delay: 1s
              - lvgl.label.update:
                  id: lbl_device_state
                  text: !lambda |-
                      if (id(device_2).state == "off") {
                        return "Apagada";
                      } else {
                        return (std::to_string((int)id(climate_temperature).state) + "°C").c_str();
                      }
              - if:
                  condition:
                    lambda: |-
                      return id(device_2).state == "heat";
                  then:
                    - lvgl.widget.show:
                        - id: arc_climate
                  else:
                    - lvgl.widget.hide:
                        - id: arc_climate
          - if:
              condition:
                lambda: |-
                  return id(device_menu).state == "${device3_name}";
              then:
              - homeassistant.action:
                  service: switch.toggle
                  data:
                    entity_id: ${device3}
              - delay: 1s
              - lvgl.label.update:
                  id: lbl_device_state
                  text: !lambda |-
                      return std::string(id(device_3).state == "on" ? "Encendido" : "Apagado");
          - if:
              condition:
                lambda: |-
                  return id(device_menu).state == "${device4_name}";
              then:
              - homeassistant.action:
                  service: switch.toggle
                  data:
                    entity_id: ${device4}
              - delay: 1s
              - lvgl.label.update:
                  id: lbl_device_state
                  text: !lambda |-
                      return std::string(id(device_4).state == "on" ? "Encendida" : "Apagada");
font:
  - file: "gfonts://Montserrat"
    id: font_menu
    size: 28
    glyphs: ${allowed_characters}
  - file: "gfonts://Montserrat"
    id: font_state
    size: 20
    glyphs: ${allowed_characters}
i2c:
  - id: i2c_bus
    sda: 17
    scl: 18
    scan: true
    frequency: 400kHz
image:
  - file: https://aguacatec.es/wp-content/uploads/2025/05/radar_off.jpg
    id: radar_off
    resize: 480x480
    type: RGB565
    transparency: alpha_channel
  - file: https://aguacatec.es/wp-content/uploads/2025/05/radar_on.jpg
    id: radar_on
    resize: 480x480
    type: RGB565
    transparency: alpha_channel
  - file: https://aguacatec.es/wp-content/uploads/2025/05/icon_goku.png
    id: icon_goku
    resize: 240x240
    type: RGB565
    transparency: alpha_channel
light:
  - platform: monochromatic
    name: "Backlight"
    output: backlight_output
    id: display_backlight
    restore_mode: ALWAYS_ON
    on_turn_off:
      lvgl.animimg.stop: animation_radar
    on_turn_on:
      select.first:
        id: device_menu
output:
  - platform: ledc
    pin: GPIO38
    id: backlight_output
select:
  - platform: template
    name: Dispositivos
    id: device_menu
    optimistic: true
    options:
    - ${device1_name}
    - ${device2_name}
    - ${device3_name}
    - ${device4_name}
    on_value:
      then:
        - lvgl.label.update:
            id: lbl_device
            text: !lambda 'return x;'
        - lvgl.label.update:
            id: lbl_device_state
            text: !lambda |-
              if (x == "${device1_name}") {
                if ((id(device_1).state == "off") || isnan(id(light_brightness).state)) {
                  return "Apagada";
                } else {
                  return (std::to_string((int)id(light_brightness).state) + "%").c_str();
                }
              } else if (x == "${device2_name}") {
                if (id(device_2).state == "off") {
                  return "Apagada";
                } else {
                  return (std::to_string((int)id(climate_temperature).state) + "°C").c_str();
                }
              } else if (x == "${device3_name}") {
                return id(device_3).state == "on" ? "Encendido" : "Apagado";
              } else if (x == "${device4_name}") {
                return id(device_4).state == "on" ? "Encendida" : "Apagada";
              } else {
                return "Bienvenido!";
              }
        - if:
            condition:
              lambda: |-
                return id(device_menu).state == "${device1_name}" && id(device_1).state == "on";
            then:
              - lvgl.widget.show:
                  - id: arc_light
            else:
              - lvgl.widget.hide:
                  - id: arc_light
        - if:
            condition:
              lambda: |-
                return id(device_menu).state == "${device2_name}" && id(device_2).state == "heat";
            then:
              - lvgl.widget.show:
                  - id: arc_climate
            else:
              - lvgl.widget.hide:
                  - id: arc_climate
sensor:
  - platform: rotary_encoder
    id: encoder
    pin_a: GPIO10
    pin_b: GPIO13
    on_clockwise:
      then:
        - lvgl.page.show: page_home
        - light.turn_on: display_backlight
        - select.next:
            id: device_menu
            cycle: true
    on_anticlockwise:
      then:
        - lvgl.page.show: page_home
        - light.turn_on: display_backlight
        - select.previous:
            id: device_menu
            cycle: true
  - platform: homeassistant
    id: light_brightness
    entity_id: ${device1_brightness}
    on_value:
      then:
      - lvgl.arc.update:
          id: arc_light
          value: !lambda 'return (int)x;'
      - if:
          condition:
            lambda: |-
              return id(device_menu).state == "${device1_name}" && id(device_1).state == "on";
          then:
          - lvgl.label.update:
              id: lbl_device_state
              text:
                format: "%.0f%%"
                args:
                  - id(light_brightness).state
  - platform: homeassistant
    id: climate_temperature
    entity_id: ${device2_temperature}
    on_value:
      then:
      - lvgl.arc.update:
          id: arc_climate
          value: !lambda 'return (int)x;'
      - if:
          condition:
            lambda: |-
              return id(device_menu).state == "${device2_name}" && id(device_2).state == "heat";
          then:
          - lvgl.label.update:
              id: lbl_device_state
              text:
                format: "%.0f °C"
                args:
                  - id(climate_temperature).state
spi:
  id: spi_bus
  mosi_pin: GPIO0
  clk_pin: GPIO46
text_sensor:
  - platform: homeassistant
    id: device_1
    entity_id: ${device1}
    internal: true
  - platform: homeassistant
    id: device_2
    entity_id: ${device2}
    internal: true
  - platform: homeassistant
    id: device_3
    entity_id: ${device3}
    internal: true
  - platform: homeassistant
    id: device_4
    entity_id: ${device4}
    internal: true
time:
  - platform: homeassistant
    id: esptime
touchscreen:
  platform: cst826
  id: touch
  #interrupt_pin: GPIO40
  #reset_pin: GPIO16
  i2c_id: i2c_bus
  skip_probe: True
  update_interval: 25ms
  #touch_timeout: 5ms
  on_touch:
    - lvgl.page.show: page_home
    - logger.log:
        format: Touch at (%d, %d)
        args: [touch.x, touch.y]
    - lambda: |-
        ESP_LOGI("cal", "x=%d, y=%d, x_raw=%d, y_raw=%0d",
            touch.x,
            touch.y,
            touch.x_raw,
            touch.y_raw
            );
  on_release:
    then:
      - if:
          condition: lvgl.is_paused
          then:
            - lvgl.page.show: page_home
            - light.turn_on: display_backlight
            - lvgl.resume:
            - lvgl.widget.redraw:
display:
  - platform: st7701s
    id: round_display
    auto_clear_enabled: false
    color_order: rgb
    data_rate: 10MHz
    spi_mode: MODE3
    dimensions:
      width: 480
      height: 480
    cs_pin: GPIO1
    #reset_pin: GPIO
    de_pin: GPIO2
    hsync_pin: GPIO3
    vsync_pin: GPIO42
    pclk_pin: GPIO45
    pclk_frequency: 12MHz
    pclk_inverted: false
    hsync_front_porch: 10
    hsync_pulse_width: 8
    hsync_back_porch: 50
    vsync_front_porch: 10
    vsync_pulse_width: 8
    vsync_back_porch: 20
    data_pins:
      red:
        - 11        #r1
        - 15        #r2
        - 12        #r3
        - 16        #r4
        - 21        #r5
      green:
        - 39        #g0
        - 07        #g1
        - 47        #g2
        - 08        #g3
        - 48        #g4
        - 09        #g5
      blue:
        - 04        #b1
        - 41        #b2
        - 05        #b3
        - 40        #b4
        - 06        #b5
    init_sequence:
      - [0x01]
      - delay 120ms
      - [0xFF, 0x77, 0x01, 0x00, 0x00, 0x10]
      - [0xC0, 0x3B, 0x00]
      - [0xC1, 0x0B, 0x02]
      - [0xC2, 0x00, 0x02]
      - [0xCC, 0x10]
      - [0xCD, 0x08]
      - [0xB0, 0x02, 0x13, 0x1B, 0x0D, 0x10, 0x05, 0x08, 0x07, 0x07, 0x24, 0x04, 0x11, 0x0E, 0x2C, 0x33, 0x1D]
      - [0xB1, 0x05, 0x13, 0x1B, 0x0D, 0x11, 0x05, 0x08, 0x07, 0x07, 0x24, 0x04, 0x11, 0x0E, 0x2C, 0x33, 0x1D]
      - [0xFF, 0x77, 0x01, 0x00, 0x00, 0x11]
      - [0xB0, 0x5d]
      - [0xB1, 0x43]
      - [0xB2, 0x81]
      - [0xB3, 0x80]
      - [0xB5, 0x43]
      - [0xB7, 0x85]
      - [0xB8, 0x20]
      - [0xC1, 0x78]
      - [0xC2, 0x78]
      - [0xD0, 0x88]
      - [0xE0, 0x00, 0x00, 0x02]
      - [0xE1, 0x03, 0xA0, 0x00, 0x00, 0x04, 0xA0, 0x00, 0x00, 0x00, 0x20, 0x20]
      - [0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
      - [0xE3, 0x00, 0x00, 0x11, 0x00]
      - [0xE4, 0x22, 0x00]
      - [0xE5, 0x05, 0xEC, 0xA0, 0xA0, 0x07, 0xEE, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
      - [0xE6, 0x00, 0x00, 0x11, 0x00]
      - [0xE7, 0x22, 0x00]
      - [0xE8, 0x06, 0xED, 0xA0, 0xA0, 0x08, 0xEF, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
      - [0xEB, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00]
      - [0xEd, 0xFF, 0xFF, 0xFF, 0xBA, 0x0A, 0xBF, 0x45, 0xFF, 0xFF, 0x54, 0xFB, 0xA0, 0xAB, 0xFF, 0xFF, 0xFF]
      - [0xEF, 0x10, 0x0D, 0x04, 0x08, 0x3F, 0x1F]
      - [0xFF, 0x77, 0x01, 0x00, 0x00, 0x13]
      - [0xEF, 0x08]
      - [0xFF, 0x77, 0x01, 0x00, 0x00, 0x00]
      - [0x36, 0x08]
      - [0x3A, 0x60]
      - [0x11]
      - delay 100ms
      - [0x29]
      - delay 50ms
lvgl:
  displays:
    - round_display
  touchscreens:
    - touch
  encoders:
    sensor: encoder
    enter_button: front_button
  buffer_size: 100%
  bg_color: 0x000000
  text_color: 0xff6600
  style_definitions:
    - id: style_roller
      text_font: font_menu
      align: CENTER
      pad_top: 300
    - id: style_device_state
      text_font: font_state
      text_color: 0x7f5100
      align: CENTER
      pad_top: 375
    - id: style_arc
      align: CENTER
      width: 400
      height: 400
      arc_color: 0x7f5100
  on_idle:
    - timeout: 20s
      then:
        - lvgl.animimg.start: animation_radar
        - logger.log: idle 20s timeout
        - lvgl.page.show: page_iddle
        - delay: 5s
        - lvgl.pause:
        - light.turn_off:
            id: display_backlight
            transition_length: 5s
  pages:
    - id: page_iddle
      widgets:
        - animimg:
            align: CENTER
            id: animation_radar
            src: [ radar_off, radar_on ]
            duration: 1000ms
    - id: page_home
      widgets:
        - image:
            align: CENTER
            src: icon_goku
            id: icongoku
        - label:
            styles: style_roller
            id: lbl_device
            text: "Aguacatec"
        - label:
            styles: style_device_state
            id: lbl_device_state
            text: "Bienvenido!"
        - arc:
            styles: style_arc
            id: arc_light
            indicator:
              arc_color: 0xff6600
            knob: 
              bg_color: 0xff6600
            adjustable: true
            value: 50
            min_value: 0
            max_value: 100
            hidden: true
            on_release:
              - homeassistant.action:
                  action: light.turn_on
                  data:
                    entity_id: ${device1}
                    brightness_pct: !lambda return int(x);
        - arc:
            styles: style_arc
            id: arc_climate
            indicator:
              arc_color: 0xff6600
            knob: 
              bg_color: 0xff6600
            adjustable: true
            value: 20
            min_value: 5
            max_value: 25
            hidden: true
            on_release:
              - homeassistant.action:
                  action: climate.set_temperature
                  data:
                    entity_id: ${device2}
                    temperature: !lambda return int(x);