devices.esphome.io
Guition ESP32-S3-4848S040 480*480 Smart Screen
Guition ESP32-S3-4848S040 480*480 Smart Screen
Device Type: miscElectrical Standard: globalBoard: esp32Difficulty: Plug-n-flash, 2/5

Product specs
| Feature | Spec | 
|---|---|
| Screen | st7701s driver 480*480 | 
| Touch screen | gt911 | 
| CPU | ESP32-S3 | 
| Flash | 16MB | 
| PSRAM | 8MB | 
Product description
Nice little integrated screen, touch screen, power supply and case with built in relay (or three) and 120v/220v power supply.
Avalible on AliExpress for ~$24.
Basic Config
substitutions:  name: "guition-esp32-s3-4848s040"  friendly_name: "Guition480-basic"  device_description: "Guition ESP32-S3-4848S040 480*480 Smart Screen"  project_name: "Guition.ESP32_S3_4848S040"  project_version: "1.0.1"
  lightbulb: "\U000F0335"  ceiling_light: "\U000F0769"  lamp: "\U000F06B5"  floor_lamp: "\U000F08DD"  string_lights: "\U000F12BA"
esphome:  name: "${name}"  friendly_name: "${friendly_name}"  #name_add_mac_suffix: true  project:    name: "${project_name}"    version: "${project_version}"  platformio_options:    board_build.flash_mode: dio
esp32:  board: esp32-s3-devkitc-1  variant: esp32s3  flash_size: 16MB  framework:    type: esp-idf    sdkconfig_options:      COMPILER_OPTIMIZATION_SIZE: y      CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"      CONFIG_ESP32S3_DATA_CACHE_64KB: "y"      CONFIG_ESP32S3_DATA_CACHE_LINE_64B: "y"      CONFIG_SPIRAM_FETCH_INSTRUCTIONS: y      CONFIG_SPIRAM_RODATA: y
psram:  mode: octal  speed: 80MHz
# Enable logginglogger:
# Enable Home Assistant APIapi:  encryption:    key: !secret encryption_key
ota:  - platform: esphome    id: my_ota    password: !secret ota_password    # display the banner    on_begin:      then:        - logger.log: "OTA start a"        - light.turn_on: backlight        - lambda: "id(backlight).loop();"        - lvgl.resume:        - lvgl.widget.redraw:        #- lvgl.widget.hide: root        - lvgl.widget.show: popup_obj        - lvgl.resume:        - lvgl.widget.redraw:        - lambda: "id(lvgl_comp).loop();"        - lambda: "id(lvgl_comp).loop();"        - logger.log: "OTA start b"    on_progress:        then:          - lvgl.bar.update:              id: popup_pb_percentage              value: !lambda "return (int)x;"          - lvgl.label.update:              id: popup_lbl_percentage              text:                format: "OTA progress %0.1f%%"                args: ["x"]          - lambda: "id(lvgl_comp).loop();"  
wifi:  ssid: !secret wifi_ssid  password: !secret wifi_password
  # Enable fallback hotspot (captive portal) in case wifi connection fails  ap:    ssid: "Guitionv1 Fallback Hotspot"    password: !secret wifi_fallback_password
time:  - platform: homeassistant    id: time_comp    on_time_sync:      - script.execute: time_update    on_time:      - minutes: '*'        seconds: 0        then:          - script.execute: time_update
script:  - id: time_update    # update the clock display    then:      - lvgl.indicator.update:          id: minute_hand          value: !lambda |-            return id(time_comp).now().minute;      - lvgl.indicator.update:          id: hour_hand          value: !lambda |-            auto now = id(time_comp).now();            return std::fmod(now.hour, 12) * 60 + now.minute;      - lvgl.label.update:          id: date_label          text: !lambda |-            static const char * const mon_names[] = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};            static char date_buf[8];            auto now = id(time_comp).now();            snprintf(date_buf, sizeof(date_buf), "%s %2d", mon_names[now.month-1], now.day_of_month);            return date_buf;      - lvgl.label.update:          id: day_label          text: !lambda |-            static const char * const day_names[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};            return day_names[id(time_comp).now().day_of_week - 1];  
web_server:  port: 80
captive_portal:
sensor:  - platform: wifi_signal    name: "WiFi Signal"    id: wifi_signal_db    update_interval: 60s    entity_category: diagnostic    internal: true
  # Reports the WiFi signal strength in %  - platform: copy    source_id: wifi_signal_db    name: "WiFi Strength"    filters:      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);    unit_of_measurement: "%"    entity_category: diagnostic
text_sensor:  - platform: wifi_info    ip_address:      name: "IP Address"      id: ip_address      entity_category: diagnostic      on_value:        then:          - lvgl.label.update:              id: ip_address_label              text:                format: "%s"                args: [ 'id(ip_address).get_state().c_str()' ]    ssid:      name: "Connected SSID"      entity_category: diagnostic    mac_address:      name: "Mac Address"      entity_category: diagnostic
color:  # Create a Home Assistant blue color  - id: ha_blue    hex: 51c0f2
#-------------------------------------------# LVGL Buttons#-------------------------------------------lvgl:  id: lvgl_comp  displays:    - my_display  touchscreens:    - touchscreen_id: my_touchscreen  on_idle:    - timeout: 10s      then:        - logger.log: idle timeout        - if:            condition:              lvgl.is_idle:                timeout: 5s            then:              - logger.log: LVGL is idle    - timeout: 15s      then:        - logger.log: idle 15s timeout        - light.turn_off:            id: backlight            transition_length: 5s        - lvgl.pause:            show_snow: true      #- lvgl.pause:      #- light.turn_off:      #    id: display_backlight      #    transition_length: 5s
  style_definitions:    - id: style_line      line_color: 0x0000FF      line_width: 8      line_rounded: true    - id: date_style      text_font: roboto24      align: center      text_color: 0x333333      bg_opa: cover      radius: 4      pad_all: 2
  theme:    button:      text_font: roboto24      scroll_on_focus: true      #group: general      radius: 25      width: 150      height: 109      pad_left: 10px      pad_top: 10px      pad_bottom: 10px      pad_right: 10px      shadow_width: 0      bg_color: 0x313131      text_color: 0xB6B6B6      checked:        bg_color: 0xCC5E14        text_color: 0xB6B6B6
  page_wrap: true  pages:    - id: main_page      skip: false      layout:        type: flex        flex_flow: column_wrap      width: 100%      bg_color: 0x000000      bg_opa: cover      pad_all: 5      widgets:        - button:            height: 223            checkable: true            id: lv_button_1            widgets:              - label:                  text_font: light40                  align: top_left                  text: $lightbulb                  id: lv_button_1_icon              - label:                  align: bottom_left                  text: "Center Light"                  long_mode: dot            on_click:              light.toggle: internal_light        - obj:            widgets:            - label:                id: ip_address_label                align: CENTER                text: 'Not connected'                text_color: ha_blue                y: +10        - meter:            height: 200            width: 200            align: center            widgets:            bg_opa: TRANSP            text_color: 0xFFFFFF            scales:              - ticks:                  width: 1                  count: 61                  length: 10                  color: 0xFFFFFF                range_from: 0                range_to: 60                angle_range: 360                rotation: 270                indicators:                  - line:                      id: minute_hand                      value: !lambda |-                        return id(time_comp).now().minute;                      width: 3                      color: 0xE0E0E0                      r_mod: -1              -                angle_range: 330                rotation: 300                range_from: 1                range_to: 12                ticks:                  width: 1                  count: 12                  length: 1                  major:                    stride: 1                    width: 4                    length: 8                    color: 0xC0C0C0                    label_gap: 6
              - angle_range: 360                rotation: 270                range_from: 0                range_to: 720                indicators:                  - line:                      id: hour_hand                      value: !lambda |-                        auto now = id(time_comp).now();                        return std::fmod(now.hour, 12) * 60 + now.minute;                      width: 4                      color: 0xA0A0A0                      r_mod: -20        - obj:            widgets:            - label:                styles: date_style                id: day_label                y: -20                text: !lambda |-                  static const char * const day_names[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};                  return day_names[id(time_comp).now().day_of_week-1];            - label:                styles: date_style                id: date_label                y: +20                text: !lambda |-                  static const char * const mon_names[] = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};                  static char date_buf[8];                  auto now = id(time_comp).now();                  snprintf(date_buf, sizeof(date_buf), "%s %2d", mon_names[now.month-1], now.day_of_month);                  return date_buf;        - obj:            id: popup_obj            hidden: true            clickable: false            x: 0            y: 0            width: 100%            height: 100%            pad_all: 10            bg_opa: cover            widgets:              - label:                  id: lbl_popup_title                  x: 2                  y: 2                  text: "OTA in progress"              - label:                  id: popup_lbl_percentage                  x: 2                  y: 30                  width: 100%                  text: "0 %"              - bar:                  id: popup_pb_percentage                  x: 2                  y: 60                  width: 100%                  height: 10                  max_value: 100                  min_value: 0                  value: 0
#-------------------------------------------# Internal outputs#-------------------------------------------output:  # Backlight LED  - platform: ledc    pin: GPIO38    id: GPIO38    frequency: 100Hz
    # Built in 240v relay  - id: internal_relay_1    platform: gpio    pin: 40
    # Additional relays (3 relay model)  - id: internal_relay_2    platform: gpio    pin: 2  - id: internal_relay_3    platform: gpio    pin: 1
#-------------------------------------------# Internal lights#-------------------------------------------light:  - platform: monochromatic    output: GPIO38    name: Backlight    id: backlight    restore_mode: ALWAYS_ON
  - platform: binary    output: internal_relay_1    name: Internal Light    id: internal_light    on_turn_on:      then:        - lvgl.widget.update:            id: lv_button_1_icon            text_color: 0xFFFF00        - lvgl.widget.update:            id: lv_button_1            state:              checked: true    on_turn_off:      then:        - lvgl.widget.update:            id: lv_button_1_icon            text_color: 0xB6B6B6        - lvgl.widget.update:            id: lv_button_1            state:              checked: false
#-------------------------------------------# Graphics and Fonts#-------------------------------------------font:  - file: "gfonts://Roboto"    id: roboto24    size: 24    bpp: 4    extras:      # https://cdnjs.cloudflare.com/ajax/libs/MaterialDesign-Webfont/7.4.47/fonts/materialdesignicons-webfont.ttf      - file: "fonts/materialdesignicons-webfont.ttf" # http://materialdesignicons.com/cdn/7.4.47/        glyphs:          [            "\U000F004B",            #"\U0000f0ed",            "\U000F006E",            "\U000F012C",            "\U000F179B",            "\U000F0748",            "\U000F1A1B",            "\U000F02DC",            "\U000F0A02",            "\U000F035F",            "\U000F0156",            "\U000F0C5F",            "\U000f0084",            "\U000f0091",          ]
  - file: "fonts/materialdesignicons-webfont.ttf" # http://materialdesignicons.com/cdn/7.4.47/    id: light40    size: 40    bpp: 4    glyphs: [        "\U000F0335", # mdi-lightbulb        "\U000F0769", # mdi-ceiling-light        "\U000F06B5", # mdi-lamp        "\U000F08DD", # mdi-floor-lamp        "\U000F12BA", # mdi-string-lights      ]
#-------------------------------------------# Touchscreen gt911 i2c#-------------------------------------------i2c:  - id: bus_a    sda: GPIO19    scl: GPIO45    #frequency: 100kHz
touchscreen:  platform: gt911  transform:    mirror_x: false    mirror_y: false  id: my_touchscreen  display: my_display
  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            );  on_release:    then:      - if:          condition: lvgl.is_paused          then:            - light.turn_on: backlight            - lvgl.resume:            - lvgl.widget.redraw:#-------------------------------------------# Display st7701s spi#-------------------------------------------spi:  - id: lcd_spi    clk_pin: GPIO48    mosi_pin: GPIO47
display:  - platform: st7701s    id: my_display    update_interval: never    auto_clear_enabled: False    spi_mode: MODE3    data_rate: 2MHz    color_order: RGB    invert_colors: False    dimensions:      width: 480      height: 480    cs_pin: 39    de_pin: 18    hsync_pin: 16    vsync_pin: 17    pclk_pin: 21    pclk_frequency: 12MHz    pclk_inverted: False    hsync_pulse_width: 8    hsync_front_porch: 10    hsync_back_porch: 20    vsync_pulse_width: 8    vsync_front_porch: 10    vsync_back_porch: 10    init_sequence:      - 1      # Custom sequences are an array, first byte is command, the rest are data.      - [0xFF, 0x77, 0x01, 0x00, 0x00, 0x10] # CMD2_BKSEL_BK0      - [0xCD, 0x00] # disable MDT flag    data_pins:      red:        - 11 #r1        - 12 #r2        - 13 #r3        - 14 #r4        - 0 #r5      green:        - 8 #g0        - 20 #g1        - 3 #g2        - 46 #g3        - 9 #g4        - 10 #g5      blue:        - 4 #b1        - 5 #b2        - 6 #b3        - 7 #b4        - 15 #b5