Waveshare Touch LCD 7"

Hi Leute,

kennt das wer von euch?

Falls ja, hätte ich ein paar Fragen:

Wie kann ich darauf code laden? Mit ESPHOME?

Habt ihr ein funktionierendes Beispiel in ESPHOME?

Kann mir wer Schritt für Schritt erklären, wie man ESPHOME Packages nutzt?

  • Wo müssen die Files hin?
  • Wie ist die Verzeichnisstruktur?

Dankeschön schon mal für eure Infos

NA dann antworte ich mir doch mal selbst.

Die Substitutions am Anfang kann man einfach nach eigenen Bedürfnisse anpassen.

Nachstehend der YAML Code für ein Uhr DEMO, basierend auf Arbeiten diese Leute:

Gingermist

DMonkey

Im YAML sind auch noch links zu den Beispielen etc. Sorry, wenn ich nicht alle Quellen aufliste.

Hier nochmal Danke an ALLE die zu dem Thema irgendwo was beigetragen haben und deren Infos ich mich mit bedient habe :smiley:

Grüße Franky

################################################################################
# Substitution Variables
################################################################################
substitutions:
  device_internal_name: esphome21
  device_wifi_name: esphome-21
  device_friendly_name: ESPHome 21
  device_ip_address: 192.168.1.199
  device_sampling_time: 30s

################################################################################
# Globals
################################################################################
globals: ##to set default reboot behavior
  - id: wifi_connection
    type: bool
    restore_value: no
    initial_value: "false"


################################################################################
# Board Configuration
################################################################################
esphome:
  name: esp32-s3-lcd-display
  friendly_name: ${device_friendly_name}
  platformio_options:
    board_upload.maximum_ram_size: 524288

psram:
  mode: octal
  speed: 80Mhz

esp32:
  variant: esp32s3
  flash_size: 16MB
  cpu_frequency: 240MHz
  framework:
    type: esp-idf

################################################################################
# Enable logging
################################################################################
logger:
  logs:
    component: ERROR

################################################################################
# Enable Home Assistant API
################################################################################
api:
  reboot_timeout: 0s
  encryption:
    key: !secret api_encryption_key

  on_client_connected:
    - if:
        condition:
          lambda: 'return (0 == client_info.find("Home Assistant "));'
        then:
          - lvgl.page.show: main_page

################################################################################
# OTA
################################################################################
ota:
  platform: esphome
  password: !secret web_server_password

################################################################################
# WiFi
################################################################################
wifi:
  networks:
    - ssid: !secret wifi_ssid
      password: !secret wifi_password
  manual_ip:
    static_ip: ${device_ip_address}
    gateway: 192.168.1.1
    subnet: 255.255.255.0

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    # ssid: ${device_wifi_name}
    password: !secret web_server_password

captive_portal:

################################################################################
# Web Server
################################################################################
web_server:
  port: 80
  version: 2
  include_internal: true
  auth:
    username: !secret web_server_user
    password: !secret web_server_password
  local: true

################################################################################
# IO Extender
################################################################################
ch422g:
  - id: ch422g_hub

################################################################################
# Switch
################################################################################
switch:
  - platform: restart
    name: "Restart"
    id: device_restart
  
  - platform: safe_mode
    name: Use Safe Mode
    id: device_safe_mode
    
  - platform: gpio
    id: lcdbacklight
    name: lcdbacklight
    pin:
      ch422g: ch422g_hub
      number: 2
      mode:
        output: true
      inverted: false
    restore_mode: ALWAYS_ON



################################################################################
# Interval
################################################################################
interval:
  - interval: 10s
    then:
      - if:
          condition:
            wifi.connected:
          then:
            - lambda: |-
                id(wifi_connection) = true;
          else:
            - lambda: |-
                id(wifi_connection) = false;

time:
  - platform: homeassistant
    id: esptime
    on_time:
      - seconds: "*"
        then:
          - script.execute: clock_update

################################################################################
# Sensors
################################################################################
sensor:
  # WiFi
  - platform: wifi_signal
    name: "WiFi Signal Sensor"
    id: ${device_internal_name}_wifi_signal_sensor
    update_interval: ${device_sampling_time}

  # Uptime
  - platform: uptime
    name: "Uptime Sensor"
    id: ${device_internal_name}_uptime_sensor
    update_interval: ${device_sampling_time}
    internal: true
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: ${device_internal_name}_uptime_human
            state: !lambda |-
              int seconds = round(id(${device_internal_name}_uptime_sensor).raw_state);
              int days = seconds / (24 * 3600);
              seconds = seconds % (24 * 3600);
              int hours = seconds / 3600;
              seconds = seconds % 3600;
              int minutes = seconds /  60;
              seconds = seconds % 60;
              return (
                (days ? to_string(days) + "d " : "") +
                (hours ? to_string(hours) + "h " : "") +
                (minutes ? to_string(minutes) + "m " : "") +
                (to_string(seconds) + "s")
              ).c_str();


################################################################################
# Text Sensors
################################################################################
text_sensor:
  #-------------------------------------------------------------------------------
  # ESP32 internal sensors
  #-------------------------------------------------------------------------------
  - platform: wifi_info
    ip_address:
      name: IP Address
      id: ${device_internal_name}_ip_address
    ssid:
      name: Connected SSID
      id: ${device_internal_name}_connected_ssid
    mac_address:
      name: Mac Wifi Address
      id: ${device_internal_name}_mac_address
  #-------------------------------------------------------------------------------
  # Custom Text sensors
  #-------------------------------------------------------------------------------
  - platform: template
    name: Uptime Human Readable
    id: ${device_internal_name}_uptime_human
    icon: mdi:clock-start

color:
  - id: my_red
    red: 100%
    green: 0%
    blue: 0%
  - id: my_pink
    red: 100%
    green: 10%
    blue: 40%
  - id: my_yellow
    red: 100%
    green: 100%
    blue: 0%
  - id: my_green
    red: 0%
    green: 100%
    blue: 0%
  - id: my_blue
    red: 0%
    green: 0%
    blue: 100%
  - id: my_gray
    red: 50%
    green: 50%
    blue: 50%
  - id: my_white
    red: 100%
    green: 100%
    blue: 100%
  - id: my_black
    red: 0%
    green: 0%
    blue: 0%

font:
  - file: "gfonts://Roboto"
    id: arial_98
    size: 98
  - file: "gfonts://Roboto"
    id: arial_96
    size: 96
  - file: "gfonts://Roboto"
    id: arial_134
    size: 134
  - file: "gfonts://Roboto"
    id: arial_128
    size: 128
  - file: "gfonts://Roboto"
    id: arial_48
    size: 48
  - file: "gfonts://Roboto"
    id: arial_36
    size: 36
  - file: "gfonts://Roboto"
    id: arial_24
    size: 24
  - file: "gfonts://Roboto"
    id: arial_12
    size: 12

script:
  - id: clock_update
    then:
      - lvgl.indicator.update:
          id: second_hand
          value: !lambda |-
            return id(esptime).now().second;
      - lvgl.indicator.update:
          id: minute_hand
          value: !lambda |-
            return id(esptime).now().minute;
      - lvgl.indicator.update:
          id: hour_hand
          value: !lambda |-
            auto now = id(esptime).now();
            return std::fmod(now.hour, 12) * 60 + now.minute;

############################################ START OF VLGL

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
      text_font: arial_24
      outline_pad: 6
      pressed:
        border_color: my_yellow
      checked:
        border_color: my_blue
      focused:
        border_color: my_gray

  style_definitions:
    - id: header_footer
      bg_color: 0x2F8CD8
      bg_grad_color: 0x005782
      bg_grad_dir: VER
      bg_opa: COVER
      border_opa: TRANSP
      radius: 0
      pad_all: 0
      pad_row: 0
      pad_column: 0
      border_color: 0x0077b3
      text_color: 0xFFFFFF
      width: 100%
      height: 30

  log_level: INFO
  color_depth: 16
  # buffer_size: 25%
  bg_color: my_black
  text_font: arial_24
  width: 800
  height: 480
  align: center

  pages:
    - id: main_page ############################## Main Page
      widgets:
        - obj: ######################################### Elegant Clock - https://community.home-assistant.io/t/esphome-elegant-lvgl-clock/772365
            height: 480
            width: 480
            align: center
            pad_all: 4
            bg_opa: 0%
            border_width: 0  
            widgets:
              - meter:
                  height: 100%
                  width: 100%
                  align: center
                  bg_color: my_gray
                  scales:
                    # Minor ticks
                    - ticks:
                        width: 2
                        count: 61
                        length: 10
                        color: my_black
                      range_from: 0
                      range_to: 60
                      angle_range: 360
                      rotation: 270

                    # Minuite hand
                      indicators:
                        - line:
                            id: minute_hand
                            width: 3
                            color: my_black
                            r_mod: -1
                    # Major ticks
                    - angle_range: 330
                      rotation: 300
                      range_from: 1
                      range_to: 12
                      ticks:
                        width: 3
                        count: 12
                        length: 20
                        color: my_black                       

                    # Hour hand
                    - angle_range: 360
                      rotation: 270
                      range_from: 0
                      range_to: 720
                      indicators:
                        - line:
                            id: hour_hand
                            width: 4
                            color: my_black
                            r_mod: -40

                    # Second hand
                    - angle_range: 360
                      rotation: 270
                      range_from: 0
                      range_to: 60
                      indicators:
                        - line:
                            id: second_hand
                            width: 2
                            color: my_red
                            r_mod: -10

              - label:
                  align: center
                  y: -180
                  text: "12"
                  text_color: my_black
              - label:
                  align: center
                  y: 180
                  text: "6"
                  text_color: my_black
              - label:
                  align: center
                  x: -180
                  text: "9"
                  text_color: my_black
              - label:
                  align: center
                  x: 180
                  text: "3"
                  text_color: my_black
              
########################################################### END OF VLGL

i2c:
  sda: GPIO08
  scl: GPIO09
  scan: True
  id: bus_a

# Define display
display:
  - platform: rpi_dpi_rgb
    id: my_display
    update_interval: never
    auto_clear_enabled: false
    color_order: RGB
    pclk_frequency: 16MHZ
    dimensions:
      width: 800
      height: 480
    de_pin:
      number: 5
    hsync_pin:
      number: 46
      ignore_strapping_warning: true
    vsync_pin:
      number: 3
      ignore_strapping_warning: true
    pclk_pin: 7
    pclk_inverted: true
    reset_pin:
      ch422g: ch422g_hub
      number: 3
    hsync_back_porch: 8
    hsync_front_porch: 8
    hsync_pulse_width: 4
    vsync_back_porch: 16
    vsync_front_porch: 16
    vsync_pulse_width: 4
    data_pins:
      red:
        - 1         #r3
        - 2         #r4
        - 42        #r5
        - 41        #r6
        - 40        #r7
      blue:
        - 14        #b3
        - 38        #b4
        - 18        #b5
        - 17        #b6
        - 10        #b7
      green:
        - 39        #g2
        - 0         #g3
        - 45        #g4
        - 48        #g5
        - 47        #g6
        - 21        #g7

touchscreen:
  platform: gt911
  id: my_touch
  interrupt_pin: GPIO4
  reset_pin:
    ch422g: ch422g_hub
    number: 1
    mode: OUTPUT




Hm, dann unterhalte ich mich mal mit mir selbst :rofl:

Inzwischen habe ich da einigen Fortschritt gemacht und ein nettes Tool gefunden,
den ESPHOME Designer, der die LVGL Geschichte und zugehörige Logik deutlich vereinfacht, da man das ohne YAML tun kann :melting_face:
Und mit ein bisschen Lesen des ESPHOME Doku zu LVGL und die Tips und Tricks, scheint das Ganze bald ins produktive Stadium zu wechseln.

Wtwas was mir auch gut gefallen hat, ich jedoch mangels Fachkenntnisse nicht zu laufen gebracht habe, isr ein Projekt, das das Dashboard oder im Prinzip jede Webseite in einem Headless Chrome Browser rendern lässt, nur den Diff zum letzten render überträgt und auf dem ESP32-Display als Bild dargestellt wird, Touch der Anzaige wird dann zurückgegeben und vom Headless ausgeführt usw…
Würde das jemand in eine APP gießen, wäre ich Feuer und Flamme, das würde das doch sehr langwierige Designen in LVGL total ersetzen :grin: :clap: :grin:

Naja die Hoffnung stirbt zuletzt.

Cheers Franky