Waveshare ESP32-S3-ETH PoE OV2640 CAM

@mx738: Toni, how did you configure the LAN PoE for that board? Are you able to kindly share?

I just got the non camera version but POE works fine using the above. You can’t put in WiFi or an AP/captive portal part when using Ethernet. Haven’t had time to add various sensors yet so left the relay in. Just flash it using USB C then plug into POE Ethernet and it shows up to add in HA.

substitutions:
  name: ws-poe-s3
  friendly_name: ws_poe_s3
  device_sampling_time: 30s

esphome:
  name: ${name}
  friendly_name: ${friendly_name}

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf
  flash_size: 16MB

psram:
  mode: octal
  speed: 80MHz  

switch:
  - platform: gpio
    name: ws-poe-32-relay1
    id: relay1                              
    pin: GPIO8
    restore_mode: ALWAYS_OFF
    setup_priority: 800
# Enable logging
logger:

debug:
  update_interval: ${device_sampling_time}   

# Enable Home Assistant API
api:
  encryption:
    key: "Api123="

ota:
  - platform: esphome
    password: "otapw"

#wifi:
#  ssid: !secret wifi_ssid
#  password: !secret wifi_password

ethernet:
  type: W5500
  mosi_pin: GPIO11
  miso_pin: GPIO12
  clk_pin: GPIO13
  cs_pin: GPIO14
  reset_pin: GPIO9
  interrupt_pin: GPIO10
  clock_speed: 25MHz  

time:
  - platform: homeassistant
    id: homeassistant_time    

button:
  - platform: safe_mode
    name: Safe Mode Boot

  - platform: factory_reset
    name: Factory reset

  - platform: restart
    id: reboot_btn
    name: restart

sensor:
  #-------------------------------------------------------------------------------
  # ESP32 internal sensors
  #-------------------------------------------------------------------------------
  # Temperature
  - platform: internal_temperature
    name: Internal Temperature
    update_interval: ${device_sampling_time}

  - platform: debug
    free:
      name: Heap free
      id: ${friendly_name}_heap_free
    block:
      name: Heap max block
      id: ${friendly_name}_heap_max_block
    loop_time:
      name: Loop time
      id: ${friendly_name}_loop_time

  - platform: template
    name: Heap free (%)
    id: ${friendly_name}_heap_free_percent
    unit_of_measurement: '%'
    accuracy_decimals: 2
    icon: mdi:percent
    update_interval: ${device_sampling_time}
    entity_category: diagnostic
    # 524288 B (SRAM total)
    # 327680 B (DRAM usable)
    lambda: return ( id(${friendly_name}_heap_free).state * 100 / 327680 );

  - platform: template
    name: Heap max block (%)
    id: ${friendly_name}_heap_max_block_percent
    unit_of_measurement: '%'
    accuracy_decimals: 2
    icon: mdi:percent
    update_interval: ${device_sampling_time}
    entity_category: diagnostic
    # 524288 B (SRAM total)
    # 327680 B (DRAM usable)
    lambda: return ( id(${friendly_name}_heap_max_block).state * 100 / 327680 );

  - platform: uptime
    name: "Uptime Sensor"
    id: ${friendly_name}_uptime_sensor
    update_interval: ${device_sampling_time}
    internal: true
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: ${friendly_name}_uptime_human
            state: !lambda |-
              int seconds = round(id(${friendly_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_sensor:
  - platform: ethernet_info
    ip_address:
      name: "IP Address" 

  #-------------------------------------------------------------------------------
  # Custom Text sensors
  #-------------------------------------------------------------------------------
  - platform: template
    name: Uptime Human Readable
    id: ${friendly_name}_uptime_human
    icon: mdi:clock-start    
    

web_server:
  port: 80
  version: 2
  include_internal: true
  ota: false      

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  #ap:
  #  ssid: "Ws-Poe-S3 Fallback Hotspot"
  #  password: "AB6J9ECa7R0F"

#captive_portal:
    

Thanks to the helpful posts above, the camera finally works quite well and with ethernet the BLE proxy works much much better than via WiFi:

No problem with brightness in esphome 2025.05.

Config with Ethernet, Camera and BLE-Proxy:


#===============================================================================
substitutions:
  device_name: you-name-for-your-device
  room_friendly_name: Maybe Your Workshop Room
#===============================================================================

esphome:
  name: ${device_name}
  platformio_options:
    board_build.arduino.memory_type: qio_opi
    board_build.flash_mode: dio
    upload_speed: 921600
    monitor_speed: 115200

esp32:
  board: esp32-s3-devkitc-1
  flash_size: 16MB
  framework:
    type: esp-idf
    sdkconfig_options:
      CONFIG_ESP32_S3_BOX_BOARD: "y"

psram:
  mode: octal
  speed: 80MHz

logger:

api:
  encryption:
    key: !secret api_encryption_psk

ota:
  - platform: esphome
    password: !secret ota_password

ethernet:
  type: W5500
  clk_pin: GPIO13
  mosi_pin: GPIO11
  miso_pin: GPIO12
  cs_pin: GPIO14
  interrupt_pin: GPIO10
  reset_pin: GPIO9

######################################
### Camera 
######################################

esp32_camera:
  name: ${room_friendly_name} Camera
  external_clock:
    pin: GPIO3
    frequency: 20MHz
  i2c_pins:
    sda: GPIO48
    scl: GPIO47
  data_pins: [GPIO41, GPIO45, GPIO46, GPIO42, GPIO40, GPIO38, GPIO15, GPIO18]
  vsync_pin: GPIO1
  href_pin: GPIO2
  pixel_clock_pin: GPIO39
  power_down_pin: GPIO8
  resolution: 640x480
  jpeg_quality: 10
    #resolution: 1280x1024
    #jpeg_quality: 30
  vertical_flip: false
  horizontal_mirror: false
  # aec_mode: MANUAL
  # aec_value: 1200
  # brightness: 2
  # wb_mode: HOME
  # agc_mode: AUTO


#######################################
### Bluetooth Proxy
#######################################

esp32_ble_tracker:
  scan_parameters:
    #  only use these values on Ethernet not WIFI
    interval: 1100ms
    window: 1100ms
    active: true

bluetooth_proxy:
  active: true

I also made an enclosure for the board, if anybody needs one:

Thanks to this thread i made it finally work.

now… this thing gets hot? or is it just in my case? (ESP32-S3-ETH, PoE module and also camera)

absolutely … any ESP32 where the camera is in use, gets quite hot in my experience. On top of that, I am sure the POE-module also generates it’s share of heat.

so: yes, that’s normal

1 Like