WaveShare ESP32-S3-GEEK

I saw this the other day and thought to myself, “there is another piece of cool crap I don’t need, buut as so the story goes…
Has a cool1.4” screen with a whooping 16mb of flash, convenient usb a form factor, meaning that :bulb: that this WILL be very convenient as a room multisensor that can be plugged in to the wall, profit :sunglasses:.

After getting it, realized I don’t know anything :sweat_smile: about this screen (aka spi bus pins and so) and the wiki and almost inexistent github official WaveShare presence, offered very little information (just an observation as this being my first experience with this manufacturer).
Searched around, but did not find any post, mention or even similar, so I guess I 'd throw stuff to the wall to see if it would stick, and it did.
This is how I made it initialize the display(and other stuff I’d learn thanks to other posting here), hope is of use for someone:

esphome:
  name: esp32-s3-geek
  friendly_name: ESP32-S3-GEEK
  # libraries:
  #   - SPI
  #   - FS
  #   - SPIFFS
  #   - TFT_eSPI
  platformio_options:
    board_build.flash_mode: dio
    board_build.f_flash: 80000000L
    # board_build.partitions: default_16MB.csv
    board_build.arduino.memory_type: qio_opi
    build_flags: 
      - "-D FORECAST_DAYS=5"    
  # on_boot:
  # #  - priority: -100 # after all init
  # #    then:
  # #     - media_player.volume_set: 8%
  #  - priority: 250.0 # after sensor WIFI initialization
  #    then:
  #     - wait_until:
  #         condition:
  #           wifi.connected:
  #     - lambda: >
  #         id(bletracker).set_scan_continuous(true);
  #         id(bletracker).start_scan();
esp32:
  board: esp32-s3-devkitc-1
  #board: esp32s3box
  framework:
    type: esp-idf
    version: recommended
  flash_size: 16MB
  variant: ESP32S3

# esp32_ble_tracker:
#   id: bletracker
#   scan_parameters:
#     continuous: false
#     active: true
# bluetooth_proxy:
#   active: true

# Enable logging
logger:
  level: DEBUG
# Enable Home Assistant API
api:
  encryption:
    key: !secret api

ota:
  password: !secret ota

wifi:
  #use_address: 10.0.2.149
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: on
  #power_save_mode: none
time:
  - platform: homeassistant
    id: time_ha

output:
  - platform: ledc
    pin: GPIO7
    id: gpio7
    frequency: 2000

light:
  - platform: monochromatic
    output: gpio7
    name: "Backlight"
    id: displaybacklight
    icon: mdi:brightness-7
    restore_mode: RESTORE_AND_ON

binary_sensor:
  - platform: gpio
    pin: 
      number: GPIO0
      inverted: true
    name: "Button 1"
    id: button1

spi:
  clk_pin: 12
  mosi_pin: 11

display:
  - platform: ili9xxx
    model: 'TFT 2.4' # 'TFT 2.4' worked with esp32-s3-geek
    #model: WAVESHARE_RES_3_5
    dimensions:
      height: 240
      width: 135
      offset_height: 40
      offset_width: 53
    transform:
      swap_xy: true
    #   mirror_x: false
    #   mirror_y: false
    color_order: rgb    
    data_rate: 80MHz
    cs_pin: GPIO10
    dc_pin: GPIO8
    reset_pin: GPIO9
    #spi_mode: MODE3
    invert_colors: true
    pages:
      - id: weather
        lambda: |-
          // clear screen
          it.clear();

          // draw the time up top
          std::string time = id(time_ha).now().strftime("%I:%M");
          std::string dayofweek = id(time_ha).now().strftime("%a, %b %e");
          it.print(0, 0, id(font1), id(color_green), TextAlign::TOP_LEFT, time.c_str());
          it.print(2, 40, id(font2), id(color_white), TextAlign::TOP_LEFT, dayofweek.c_str());

  
font:

  - file: 'slkscr.ttf'
    id: font1
    size: 40

  - file: 'BebasNeue-Regular.ttf'
    id: font2
    size: 30

  - file: 'arial.ttf'
    id: font3
    size: 14

color:
  - id: color_light_grey
    hex: BBBBBB   
  - id: color_dark_grey
    hex: 5F5F5F
  - id: color_white
    hex: FFFFFF   
  - id: color_red
    hex: FF0000
  - id: color_green
    hex: 14FF00
  - id: color_yellow
    hex: FFFF00
2 Likes

Thanks for this! I’m a couple of days behind you, having just received this device today. And I wanted to do the same just to see if/how it works. And it works! Thanks for saving me many days.

you are very welcome, I will post some more stuff I am doing with it. It’s turning out to be a badass sensor.

Did you enter this in the config for Home Assistant or this setting up the ESPHome?

Hello guys,

I just bought this wonderfull device and i have started playing with it.
My firs project was to create EPSHome Bluetooth proxy with information on the screen about connectivity, signal strength, etc.

This ESPHome configuration transforms the ESP32-S3 GEEK into a Bluetooth Proxy with a 1.14” ST7789V display, allowing real-time monitoring of WiFi, Home Assistant status, and detected BLE devices.

:pushpin: Features:

:white_check_mark: Bluetooth Proxy for Home Assistant – Extends BLE coverage

:white_check_mark: Multi-Screen UI – Switch between screens using a physical button

:white_check_mark: WiFi & Home Assistant Status – Displays “Connected” (Green) / “Disconnected” (Red)

:white_check_mark: Last Detected BLE Device – Shows the most recently scanned BLE device

:white_check_mark: WiFi Signal Strength – Monitor connectivity quality

:white_check_mark: Optimized for ESP32-S3 with TTGO T-Display (240x135, ST7789V)

:hammer_and_wrench: How It Works:

:small_blue_diamond: Screen 1: Displays WiFi status, Home Assistant status, and the last BLE device.

:small_blue_diamond: Screen 2: Shows WiFi signal strength and BLE device count.

:small_blue_diamond: Button Press: Switches between screens.

This project is a ready-to-use ESPHome setup that enables smart monitoring with ESP32-S3 , making it perfect for BLE tracking, Home Assistant integrations, and smart home automation! :rocket:

esphome:
  name: esp32-s3-geek
  friendly_name: ESP32-S3-GEEK
  platformio_options:
    board_build.flash_mode: dio
    board_build.f_flash: 80000000L
    board_build.arduino.memory_type: qio_opi
    build_flags: 
      - "-D FORECAST_DAYS=5"

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf
    version: recommended
  flash_size: 16MB
  variant: ESP32S3

# Enable logging
logger:
  level: DEBUG

# Enable Home Assistant API
api:
  encryption:
    key: "YOUR ENCRYPTION KEY"
  on_client_connected:
    - lambda: |-
        id(ha_status) = "Connected";
  on_client_disconnected:
    - lambda: |-
        id(ha_status) = "Disconnected";

ota:
  platform: esphome
  password: "YOUR PASSWORD"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: true
  on_connect:
    - lambda: |-
        id(wifi_status) = "Connected";
  on_disconnect:
    - lambda: |-
        id(wifi_status) = "Disconnected";

# Bluetooth Proxy
bluetooth_proxy:
  active: true

# Global variables for display
globals:
  - id: screen_index
    type: int
    restore_value: no
    initial_value: '0'
  - id: wifi_status
    type: std::string
    restore_value: no
    initial_value: '"Unknown"'
  - id: ha_status
    type: std::string
    restore_value: no
    initial_value: '"Unknown"'
  - id: ble_device_name
    type: std::string
    restore_value: no
    initial_value: '"--"'

# Bluetooth Tracker
esp32_ble_tracker:

binary_sensor:
  - platform: gpio
    pin: 
      number: GPIO1
      inverted: true
    name: "Button 1"
    id: button1
    on_press:
      then:
        - lambda: |-
            id(screen_index) = (id(screen_index) + 1) % 2;

sensor:
  - platform: wifi_signal
    name: "WiFi Signal"
    id: wifi_strength
    update_interval: 30s

# SPI settings for ST7789 LCD
spi:
  clk_pin: GPIO12
  mosi_pin: GPIO11

# Font settings
font:
  - file: "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
    id: font1
    size: 24
  - file: "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"
    id: font2
    size: 18
  - file: "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
    id: font3
    size: 14

# LCD Display Configuration
display:
  - platform: st7789v
    model: "TTGO_TDISPLAY_135X240"
    cs_pin: GPIO10
    dc_pin: GPIO8
    reset_pin: GPIO9
    rotation: 270
    update_interval: 500ms
    lambda: |-
      it.fill(Color::BLACK);
      if (id(screen_index) == 0) {
        it.print(10, 20, id(font2), id(color_white), "WiFi: ");
        it.print(90, 20, id(font2), id(wifi_status) == "Connected" ? id(color_green) : id(color_red), id(wifi_status).c_str());
        
        it.print(10, 60, id(font2), id(color_white), "HA: ");
        it.print(70, 60, id(font2), id(ha_status) == "Connected" ? id(color_green) : id(color_red), id(ha_status).c_str());
        
        it.print(10, 100, id(font2), id(color_white), "Last BLE: ");
        it.print(130, 100, id(font2), id(color_white), id(ble_device_name).c_str());
      } else {
        it.print(10, 20, id(font2), id(color_white), "WiFi Signal: ");
        it.printf(150, 20, id(font2), id(color_white), "%d dBm", (int)id(wifi_strength).state);
        it.print(10, 60, id(font2), id(color_white), "Press Btn to return");
      }

color:
  - id: color_light_grey
    hex: BBBBBB
  - id: color_dark_grey
    hex: 5F5F5F
  - id: color_white
    hex: FFFFFF
  - id: color_red
    hex: FF0000
  - id: color_green
    hex: 14FF00
  - id: color_yellow
    hex: FFFF00

Hafe fun playing :smiley:

I have a basement full of “things”. But I thought of some uses for this right off, so more things…

this is incredible, thank you!

I loaded this on mine today using ESPHome builder in HA. I did the initial setup using web.esphome.io, then I “took control” in ESPHome builder, pressed Edit and pasted over everything with your code, flashed it successfully… but I’m not 100% sure if it’s working correctly… I added an encryption key and an update password.

On the screen on the device it shows it’s connected to wifi and Home Assistant, there is just a dash where the last BLE device should show and the button does not switch screens.

When I load the logs it says the following -

[20:24:02][W][component:238]: Components should block for at most 30 ms.
[20:24:03][W][component:237]: Component display took a long time for an operation (184 ms).
[20:24:03][W][component:238]: Components should block for at most 30 ms.
[20:24:03][W][component:237]: Component display took a long time for an operation (184 ms).
[20:24:03][W][component:238]: Components should block for at most 30 ms.
[20:24:04][W][component:237]: Component display took a long time for an operation (184 ms).
[20:24:04][W][component:238]: Components should block for at most 30 ms.
[20:24:04][D][sensor:093]: 'WiFi Signal': Sending state -59.00000 dBm with 0 decimals of accuracy
[20:24:04][W][component:237]: Component display took a long time for an operation (184 ms).
[20:24:04][W][component:238]: Components should block for at most 30 ms.
[20:24:05][W][component:237]: Component display took a long time for an operation (184 ms).
[20:24:05][W][component:238]: Components should block for at most 30 ms.

I think the bluetooth proxy is working as bluetooth stability has seemingly improved but I’m not sure how to actually confirm it’s functioning (I have all my BLE devices integrated already so I wasn’t expecting any new devices to appear)… I’ll need to learn more about bluetooth proxies in general I think!

just one additional thing to add, while the ESP Home intergration doesn’t label the device as a bluetooth proxy, I’m not sure if that’s normal or just because I named the device myself, it is showing in the Bluetooth integration alongside my Bluetooth dongle that is direct plugged in to HA

Has anyone gotten this to work on ESPHome?

Would love to get this working properly, any ideas?

No. I can’t even get it to simply connect to WIFI with a basic configuration yaml file.

I was actually referring to the script above by “nenad.jokic”, it works and connects to WiFi and Home Assistant just fine but the button does nothing, it should change screens. The “last BLE device” is always blank so it’s hard to tell if it’s even working… even though it says it’s Connected to Wifi and Home Assistant just fine.

I just can’t get Screen 2 to show and am unsure how to confirm it’s working… On HA, it doesn’t show any connected devices to this thing but BLE connectivity seems to have improved.

Did you run through the initial setup on esphome to connect to WiFi? do you have your wifi details in your secrets.yaml or defined in the yaml itself?

Maybe it’s broken.
That board should be good on Arduino with default settings for Esp32S3 Dev Module.

As I said above, I have dozens of ESP devices around the house. Mostly DIY on 8266 modules. I have always used ESPHome Builder to generate the bin file then use ESPHome Flasher or ESPTools.py to flash the device.

I got it working using esptool.py:

python -m esptool --port COM78 erase_flash
python -m esptool --port COM78 write_flash 0x0 r:/esp32-s3-geek.factory.bin

Details in Post 15.

Update. I have it mostly working. The button is on GPIO0, and a press does switch the screens.

I haven’t done anything with Bluetooth because I have no Bluetooth devices here.

Here is my working configuration:

# esp32-s3-geek.yaml
#
# Screen 1: Displays WiFi status, Home Assistant status, and the last BLE device.
# Screen 2: Shows WiFi signal strength and BLE device count.
# Button Press: Switches between screens.
#
#This project is a ready-to-use ESPHome setup that enables smart monitoring with ESP32-S3,
#making it perfect for BLE tracking, Home Assistant integrations, and smart home automation!
#
# Original configuration from: https://community.home-assistant.io/t/waveshare-esp32-s3-geek/695621/5
#
# My changes, changed button to GPIO0, added code to blink an LED.
###########################################################################################

substitutions:
  my_led: GPIO14

esphome:
  name: esp32-s3-geek
  friendly_name: ESP32-S3-GEEK
  platformio_options:
    board_build.flash_mode: dio
    board_build.f_flash: 80000000L
    board_build.arduino.memory_type: qio_opi
    build_flags: 
      - "-D FORECAST_DAYS=5"

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf
    version: recommended
  flash_size: 16MB
  variant: ESP32S3

# Enable logging
logger:
  level: ERROR

# Enable Home Assistant API
api:
  on_client_connected:
    then:
      - lambda: |-
          id(ha_status) = "Connected";
  on_client_disconnected:
    then:
      - lambda: |-
          id(ha_status) = "Disconnected";

ota:
  platform: esphome

wifi:
  ssid: !secret iot_ssid
  password: !secret iot_password
  fast_connect: true
  on_connect:
    then:
      - lambda: |-
          id(wifi_status) = "Connected";
  on_disconnect:
    then:
      - lambda: |-
          id(wifi_status) = "Disconnected";

# Bluetooth Proxy
#bluetooth_proxy:
#  active: true

# Global variables for display
globals:
  - id: screen_index
    type: int
    restore_value: no
    initial_value: '0'
  - id: wifi_status
    type: std::string
    restore_value: no
    initial_value: '"Unknown"'
  - id: ha_status
    type: std::string
    restore_value: no
    initial_value: '"Unknown"'
  - id: ble_device_name
    type: std::string
    restore_value: no
    initial_value: '"--"'

# Bluetooth Tracker
#esp32_ble_tracker:

binary_sensor:
  - platform: gpio
    pin: 
      number: GPIO0
      inverted: true
    name: "Button 1"
    id: button1
    on_press:
      then:
        - lambda: |-
            id(screen_index) = (id(screen_index) + 1) % 2;

sensor:
  - platform: wifi_signal
    name: "WiFi Signal"
    id: wifi_strength
    update_interval: 30s

# SPI settings for ST7789 LCD
spi:
  clk_pin: GPIO12
  mosi_pin: GPIO11

# Font settings
font:
  - file: "/config/esphome/fonts/DejaVuSans.ttf"
    id: font1
    size: 24
  - file: "/config/esphome/fonts/DejaVuSans-Bold.ttf"
    id: font2
    size: 18
  - file: "/config/esphome/fonts/DejaVuSans.ttf"
    id: font3
    size: 14

# LCD Display Configuration
display:
  - platform: st7789v
    model: "TTGO_TDISPLAY_135X240"
    cs_pin: GPIO10
    dc_pin: GPIO8
    reset_pin: GPIO9
    rotation: 270
    update_interval: 500ms
    lambda: |-
      it.fill(Color::BLACK);
      if (id(screen_index) == 0) {
        it.print(10, 20, id(font2), id(color_white), "WiFi: ");
        it.print(90, 20, id(font2), id(wifi_status) == "Connected" ? id(color_green) : id(color_red), id(wifi_status).c_str());

        it.print(10, 60, id(font2), id(color_white), "HA: ");
        it.print(70, 60, id(font2), id(ha_status) == "Connected" ? id(color_green) : id(color_red), id(ha_status).c_str());
        
        it.print(10, 100, id(font2), id(color_white), "Last BLE: ");
        it.print(130, 100, id(font2), id(color_white), id(ble_device_name).c_str());
      } else {
        it.print(10, 20, id(font2), id(color_white), "WiFi Signal: ");
        it.printf(150, 20, id(font2), id(color_white), "%d dBm", (int)id(wifi_strength).state);
        it.print(10, 60, id(font2), id(color_white), "Press Btn to return");
      }

color:
  - id: color_light_grey
    hex: BBBBBB
  - id: color_dark_grey
    hex: 5F5F5F
  - id: color_white
    hex: FFFFFF
  - id: color_red
    hex: FF0000
  - id: color_green
    hex: 14FF00
  - id: color_yellow
    hex: FFFF00

    ##########################################      
# Blink the LED (LED_BUILTIN)
switch:
  - platform: gpio
    pin:
      number: ${my_led}
      mode: output
    id: builtinLED

interval:
  - interval: 500ms
    then:
      - switch.toggle: builtinLED      

That did help get the screen switching working, thank you!

Not sure why the bluetooth proxy was stripped out given that’s the primary use for this setup, connecting to Home Assistant as a Bluetooth Proxy and displaying information about Bluetooth Proxy devices.

A few other things were tweaked and removed so I have restored all of that so it now builds correctly and seems to work.

I never seem to see anything in the last connected device section but bluetooth range does seem to have improved. If anyone knows about that, let me know.

Here’s an updated template that keeps original functionality but the screen switch works now.

Summary of BLE devices and Last BLE Connected device still remain blank, unsure if this is an error or if it’s really not connected to anything.

Restored Key Bluetooth Proxy functionality
Restored correct wifi secret path
Restored correct font paths
Restored Encryption key
Restored OTA password
Restored Debug logging (this can be changed to ERROR once you’re happy)
Removed unnecessary added LED blinking

# esp32-s3-geek.yaml
#
# Screen 1: Displays WiFi status, Home Assistant status, and the last BLE device.
# Screen 2: Shows WiFi signal strength and BLE device count.
# Button Press: Switches between screens.
#
#This project is a ready-to-use ESPHome setup that enables smart monitoring with ESP32-S3,
#making it perfect for BLE tracking, Home Assistant integrations, and smart home automation!
#
# Original configuration from: https://community.home-assistant.io/t/waveshare-esp32-s3-geek/695621/5
#
# Button now works, original functionality restored.
# Last BLE connected device still unconfirmed if working and 
# debug log still shows the same errors as before
# unsure if that is expected
###########################################################################################

substitutions:
  my_led: GPIO14

esphome:
  name: esp32-s3-geek
  friendly_name: ESP32-S3-GEEK
  platformio_options:
    board_build.flash_mode: dio
    board_build.f_flash: 80000000L
    board_build.arduino.memory_type: qio_opi
    build_flags: 
      - "-D FORECAST_DAYS=5"

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf
    version: recommended
  flash_size: 16MB
  variant: ESP32S3

# Enable logging
logger:
  level: DEBUG

# Enable Home Assistant API
api:
  encryption:
    key: "YOUR ENCRYPTION KEY"
  on_client_connected:
    then:
      - lambda: |-
          id(ha_status) = "Connected";
  on_client_disconnected:
    then:
      - lambda: |-
          id(ha_status) = "Disconnected";

ota:
  platform: esphome
  password: "YOUR PASSWORD"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: true
  on_connect:
    then:
      - lambda: |-
          id(wifi_status) = "Connected";
  on_disconnect:
    then:
      - lambda: |-
          id(wifi_status) = "Disconnected";

# Bluetooth Proxy
bluetooth_proxy:
  active: true

# Global variables for display
globals:
  - id: screen_index
    type: int
    restore_value: no
    initial_value: '0'
  - id: wifi_status
    type: std::string
    restore_value: no
    initial_value: '"Unknown"'
  - id: ha_status
    type: std::string
    restore_value: no
    initial_value: '"Unknown"'
  - id: ble_device_name
    type: std::string
    restore_value: no
    initial_value: '"--"'

# Bluetooth Tracker
#esp32_ble_tracker:

binary_sensor:
  - platform: gpio
    pin: 
      number: GPIO0
      inverted: true
    name: "Button 1"
    id: button1
    on_press:
      then:
        - lambda: |-
            id(screen_index) = (id(screen_index) + 1) % 2;

sensor:
  - platform: wifi_signal
    name: "WiFi Signal"
    id: wifi_strength
    update_interval: 30s

# SPI settings for ST7789 LCD
spi:
  clk_pin: GPIO12
  mosi_pin: GPIO11

# Font settings
font:
  - file: "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
    id: font1
    size: 24
  - file: "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"
    id: font2
    size: 18
  - file: "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
    id: font3
    size: 14

# LCD Display Configuration
display:
  - platform: st7789v
    model: "TTGO_TDISPLAY_135X240"
    cs_pin: GPIO10
    dc_pin: GPIO8
    reset_pin: GPIO9
    rotation: 270
    update_interval: 500ms
    lambda: |-
      it.fill(Color::BLACK);
      if (id(screen_index) == 0) {
        it.print(10, 20, id(font2), id(color_white), "WiFi: ");
        it.print(90, 20, id(font2), id(wifi_status) == "Connected" ? id(color_green) : id(color_red), id(wifi_status).c_str());

        it.print(10, 60, id(font2), id(color_white), "HA: ");
        it.print(70, 60, id(font2), id(ha_status) == "Connected" ? id(color_green) : id(color_red), id(ha_status).c_str());
        
        it.print(10, 100, id(font2), id(color_white), "Last BLE: ");
        it.print(130, 100, id(font2), id(color_white), id(ble_device_name).c_str());
      } else {
        it.print(10, 20, id(font2), id(color_white), "WiFi Signal: ");
        it.printf(150, 20, id(font2), id(color_white), "%d dBm", (int)id(wifi_strength).state);
        it.print(10, 60, id(font2), id(color_white), "Press Btn to return");
      }

color:
  - id: color_light_grey
    hex: BBBBBB
  - id: color_dark_grey
    hex: 5F5F5F
  - id: color_white
    hex: FFFFFF
  - id: color_red
    hex: FF0000
  - id: color_green
    hex: 14FF00
  - id: color_yellow
    hex: FFFF00
[12:26:10][W][component:237]: Component display took a long time for an operation (185 ms).
[12:26:10][W][component:238]: Components should block for at most 30 ms.
[12:26:11][W][component:237]: Component display took a long time for an operation (185 ms).
[12:26:11][W][component:238]: Components should block for at most 30 ms.
[12:26:11][W][component:237]: Component display took a long time for an operation (185 ms).
[12:26:11][W][component:238]: Components should block for at most 30 ms.
[12:26:12][W][component:237]: Component display took a long time for an operation (186 ms).
[12:26:12][W][component:238]: Components should block for at most 30 ms.
[12:26:12][W][component:237]: Component display took a long time for an operation (185 ms).
[12:26:12][W][component:238]: Components should block for at most 30 ms.

The ESP32-S3-GEEK is a development board. There is no “primary use” in its design.

My configuration was a MINIMUM configuration to verify that the GEEK board was working. Nothing else.

As for your snide comments:

  1. Bluetooth- I have no BLE devices and couldn’t tell you if the Bluetooth Proxy was working, so I commented it out of MY configuration.
  2. “Correct” WiFi secret path? You can name yours any way you wish. What makes yours more “correct” than mine?
  3. Font Paths- You can put fonts anywhere that Home Assistant can see them. There is no /usr/share path in HAOS, so what path is correct for you is not the “correct path” for everyone else.
  4. Encryption key- is optional. Always has been.
  5. OTA Password- is optional. Always has been.
  6. Debug logging- the debug level is optional, whatever makes you happy.
  7. Unnecessary LED blinking- Again, OPTIONAL.

What part of “my configuration to determine that the development board was working” did you not understand? You may never use a GPIO output, so that makes it “unnecessary” for everyone else?

Had you posted this in Share your Projects as a BLE Proxy, then I wouldn’t have done any more than offer the correct GPIO for the button.

Since the thread is in ESPHome, I posted the configuration that I used to verify the board was working, just in case others were having similar startup issues.

We were tweaking a script that was posted above to turn this in to a Bluetooth Proxy for Home Assistant. That’s what I was referring to.

Tested BLE, it does register a BLE beacon. I don’t think we need this line, this is just for “active” connections which doesn’t include beacon probing, that is connectionless - effectively a MAC-layer ping or similar. Without this I still receive beacon notifications:

bluetooth_proxy:
  active: true

I did add this just in case the package wasn’t in the default loadout for the board, which I’ve done for other ESP32-S3 based BLE proxies:

packages:
  esphome.bluetooth-proxy: github://esphome/bluetooth-proxies/esp32-generic/esp32-generic-c3.yaml@main