Great ESP32 Board for an ESPHome Bluetooth Proxy

Seed Studio introduced a new product In June. I found it to be the ideal solution for a Bluetooth Proxy so I wanted to share here. For $20, you get a package with an ESP32 S3 Plus, External Antenna, and POE Ethernet already assembled in a case. It is not quite as cheap as buying a chip alone but for anyone looking for a super simple solution with ethernet and an external antenna for added BT distance, this is about as easy as it gets. Just program and go.

https://www.seeedstudio.com/blog/2025/06/19/introducing-xiao-w5500-ethernet-adaptor-available-now-at-19-9

The ESP32-S3 is excellent because it has Bluetooth version 5.0 which has longer distance than most of the earlier chips. In my testing of another Seed ESP32 S3 with an external antenna, I have been able to reach my robotic lawn mower at a distance of 45 meters (150 ft). The added bonus of this device is that it has both the S3 chip and hardwired Ethernet so the antenna can be dedicated to Bluetooth. I had stability problems with my other S3 as a BT proxy over WIFI. I found it difficult to find a board that had both the S3 and ethernet that didn’t require any soldering but this works great and is super simple.

It did take me a bit to figure out the ethernet pin configuration. I am posting here for anyone else that may want to use this.

esphome:
  name: eth1-bt-proxy
  friendly_name: Eth1 BT Proxy

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf

#Using with ethernet so commenting out WIFI
#wifi:
  #ssid: SSID
  #password: WIFIPASSWORD
# Enable fallback hotspot in case wifi connection fails
  #ap:
    #ssid: "Bluetooth-Proxy Fallback Hotspot"
    #password: BTProxyPassword

ethernet:
  type: W5500
  clk_pin: GPIO7
  mosi_pin: GPIO9
  miso_pin: GPIO8
  cs_pin: GPIO2

# Enable logging
logger:

# Enable Home Assistant API
api:
#Comment out if not using encryption
#  encryption:
#    key: "YOURENCRYPTIONKEY"

ota:
  - platform: esphome
    password: "ota password"

esp32_ble_tracker:
  scan_parameters:
    interval: 1100ms
    window: 1100ms
    active: True

bluetooth_proxy:
  active: true
  connection_slots: 3

button:
  - platform: restart
    name: "BT Proxy Restart"
    icon: "mdi:restart"
    entity_category: diagnostic

sensor:
  - platform: uptime
    name: "Uptime"
    entity_category: diagnostic

text_sensor:
  - platform: version
    name: "Firmware Version"
    entity_category: diagnostic

I used ESPHome builder add-on in Home Assistant to install the YAML above. After that, I just plug it into my network and it appears. Super easy.

I haven’t tested the range on this particular device yet but will report back after I do.

I am not associated with Seed and get no benefit with the post. Just sharing my positive experience.

12 Likes

Great stuff and thanks for sharing!

A comparable device around the same price (for me a little cheaper after shipping costs) is the GL.inet GL-S10, which you can buy pre-flashed with ESPHome.

The wireless range of these is similarly excellent due to to the external antenna.

gl-s10 is BLE 4.2 though, the seeed studio is BLE 5 so better off with that.

Good point, though ESPHome doesn’t make use of the BLE 5 features at present.

They are crazy with their shipping costs. From 19.90 to almost double.

For me it is more about distance. “While Bluetooth 4.2 typically has a range of around 60 meters (200 feet), Bluetooth 5.0 quadruples that range to 240 meters (800 feet).” My real world experience with my mower is more like 50 meters across an open yard but either way, I assume BT5.0 and external antenna improves the range when the client also has BT5. I guess now that I look at those numbers, maybe my mower is BT4.2 and that is why I only get 50 meters.

BLE 5 can increase range, but only when the newer Coded PHY is used (lower bit rate with error corection) which ESPHome doesn’t currently support, and very few consumer devices use anyway. A good antenna is the best way to get good range.

Aliexpress has seller with less shipping costs

1 Like

I have tested this device and it disconnected at about 45 meters across the open yard so that is the end of its range. I may purchase a higher gain antenna. It has been stable in testing so far unlike my wifi device which needed frequent resets so I am happy I switched to hardwired ethernet.

I concur, I have three of them running for a little over a month now. They are doing a very good job communicating with my various BLE devices. Easy to flash and easy to deploy especially of you have PoE out and about. For USA shoppers SEEED has domestic shipping, still pricey. All in cost for each unit at qty 4 is USD 29 with FedEX ground shipping.

Just a heads up - if you need active GATT connections for your Bluetooth devices, you might want to hold off on ordering the ESP32-S3 boards for now.

We discovered some performance issues with Bluetooth proxy on the S3 chips in current ESPHome versions. The ESP32 classic works fine because it has different defaults, but the S3 has been having some trouble with GATT connections.

The good news is we’re already working on fixes that’ll be in ESPHome 2025.8.0, which is tentatively scheduled for August 20th. Honestly, by the time you order and receive the board, the new version will probably be out anyway.

For context - the S3 is newer hardware with some changes to the Bluetooth stack to supports BLE5 features. This introduces a whole new set of challenges and tuning requirements, and we’re just now dedicating developer time to optimize Bluetooth proxy on these chips.

One final note - you might not even notice the performance issues with the S3 if the Bluetooth device you’re connecting to has a small service list. However, if it has a large service list, you could end up with repeated failed connections, or it may not be able to connect at all to some devices.

5 Likes

Thank you for this update! I have been having issues keeping it connected. I think moving to hardwired Ethernet helped. I appreciate you working to improve the S3 Bluetooth!

@jaspersk @clydebarrow since we are talking about BLE for the mower connection which is obviously outside, are both the options you guys have above waterproof or how are you housing them outdoors?

I’ve been doing a lot of testing with these boards with ESPHome 2025.8.x-dev. There is one remaining issue that hasn’t been solved but it very much looks like a race bug in the underlying ESP-IDF that is more likely to happen with the ESP32S3 chips with ethernet because they are faster than the ESP32 classic and more likely to hit the race condition. The impact is not so bad as it usually retries and connects anyways though.

I submitted If direct BLE connection completes too quickly, sometimes it gets cancelled with 0x100 because the link flag is set too late (more likely on s3 with ethernet) (IDFGH-16302) · Issue #17452 · espressif/esp-idf · GitHub

Good news. It turned out to be an issue we can solve in ESPHome [bluetooth_proxy] Fix connection slot race by deferring slot release until GATT close by bdraco · Pull Request #10303 · esphome/esphome · GitHub and BRC fix: treat ESP_GATT_CONN_CONN_CANCEL as out-of-slots error by bdraco · Pull Request #180 · Bluetooth-Devices/bleak-retry-connector · GitHub Bump bleak-retry-connector to 4.0.2 by bdraco · Pull Request #150899 · home-assistant/core · GitHub

2 Likes

any updates on this?

The tradeoff with these boards is they use W5500 for ethernet which has SPI overhead and there doesn’t appear to be an interrupt pin so the latency is a bit higher that using the Olimex boards with the IP101 ethernet.

There is plenty of cpu time free though if you are using it as a proxy so can get away with a polling interval of 1ms (~70% reduction in latancy) to get near IP101 ethernet performance (Only ~0.6-1.1ms slower than native IP101)

ethernet:
  type: W5500
  clk_pin: GPIO7
  mosi_pin: GPIO9
  miso_pin: GPIO8
  cs_pin: GPIO2
  polling_interval: 1ms  # decreased from 10ms default

Between that an upgrading to ESPHome 2025.8.x it should be quite solid.

It looks like the underlying hardware supports interrupts but the interrupt pin is not wired up. I found the PCB https://files.seeedstudio.com/wiki/xiao_w5500_poe/res/XIAO_POE_RJ45_V20.kicad_pcb it it looks like nothing is connected to 36 (INTn) on the W5500 so no way to get interrupts out of box https://files.seeedstudio.com/wiki/xiao_w5500_poe/res/W5500_ds_datasheet.pdf. Thats unfortunate as it means we could have avoided polling, but with the amount of CPU headroom its not too big of an issue. Seems like a missed opportunity.

Updated: See Great ESP32 Board for an ESPHome Bluetooth Proxy - #29 by bdraco

TL;DR: If you plan on using this board as a Bluetooth proxy, hold off for now.

I picked up 20+ of these for testing and deployed them widely. In my experience, a lot of battery-powered devices — mostly Inkbird (the most problematic) and Onvis HomeKit devices — couldn’t establish a GATT connection with these boards.

To rule out power design issues, I tested both PoE and USB power. The problem persisted in both cases. I even tested with Wi-Fi instead of Ethernet, thinking it might be some type of interference with how Ethernet is positioned on the board, but had the same result. It does connect occasionally (about 1 out of 20 attempts), which supports the idea that there may be some kind of interference being generated by the board design — though that’s just a guess. The failures are consistent, with ESP_GATT_CONN_FAIL_ESTABLISH (0x3E) errors such as:

[23:14:22][D][esp-idf:000][BTU_TASK]: W (65685) BT_HCI: hci cmd send: disconnect: hdl 0x1, rsn:0x13
[23:14:22][D][esp-idf:000][BTU_TASK]: W (66013) BT_HCI: hcif disc complete: hdl 0x2, rsn 0x3e dev_find 1
[23:14:24][D][esp-idf:000][BTU_TASK]: W (67899) BT_HCI: hcif disc complete: hdl 0x1, rsn 0x3e dev_find 1
[23:14:25][D][esp-idf:000][BTU_TASK]: W (69159) BT_HCI: hcif disc complete: hdl 0x1, rsn 0x3e dev_find 1
[23:14:27][D][esp32_ble_client:355]: [0] [49:21:09:09:65:49] ESP_GATTC_DISCONNECT_EVT, reason 0x3e
[23:14:27][D][bluetooth_proxy.connection:380]: [0] [49:21:09:09:65:49] Disconnect, reason=0x3e

For comparison, I’ve also tested a few other ESP32-S3 options, including the Waveshare ESP32-S3-ETH and the Seeed Studio XIAO ESP32-S3 (non-Plus version). These both worked fine and had no trouble establishing connections. The Seeed XIAO ESP32-S3 in particular has been solid for me not just with Bluetooth but also for Wi-Fi projects. This rules out the problem being the S3 chip itself — it’s working well with ESPHome 2025.8.0+.

The W5500 board I tried uses the XIAO ESP32-S3-Plus internally (I took it apart). I’m not sure if it’s something about the board’s physical layout or differences in the Plus variant itself, but Seeed mentions this is an “early build”, so it’s likely still maturing.

I really wanted to love this board — the form factor is great, the prebuilt case is very nice, it even offers PoE and isolation, and the price point is very attractive for what you get. But the functional problems hold it back. Another missed opportunity is that the interrupt pin and reset pin on the W5500 aren’t wired up, which could have helped with latency and stability. Taken together, this makes it hard to recommend right now. I’ll revisit this if Seeed updates the board.

It’s also worth noting that the product page doesn’t mention anything about Bluetooth, so it’s not surprising that Seeed may not have tested or expected it to be used as a Bluetooth proxy. The board works just fine for other use cases — it’s just not a good fit for a Bluetooth proxy in its current form.


If you need something solid today, I still recommend the Olimex ESP32-POE-ISO-EA together with the Olimex BOX-ESP32-POE-ISO-EA-F.

These are proven stable and are also compatible with the ESPHome ready-made projects.


If Seeed can resolve the connectivity issues and wire up the missing W5500 pins in a future revision, this could become a fantastic option given the features and cost.

3 Likes

How does it work for passive listening (thermometers), such as the Xiaomi LYWSD03MMC (pvvx or atc) firmwares.

Passive seems to be fine, however the RF performance issues likely reduce the usable range.

1 Like