ESP32 BLE Proxy

Wonder if someone can offer something to get me in the right direction.

So, I’m trying to connect the ESP32 S3 Dev board BLE to a Duracell Dura Hybrid inverter to mimc the application and once connected I need to read the advertising data and send back to the inverter commands.

How would one connect to the device in question? I do see a number of BLE devices on the advertisements section.

Config
`substitutions:
name: esp32-bluetooth-proxy-8965ac
friendly_name: ESP32 Bluetooth Proxy
packages:
esphome.bluetooth-proxy: github://esphome/bluetooth-proxies/esp32-generic/esp32-generic-s3.yaml@main
esphome:
name: ${name}
name_add_mac_suffix: false
friendly_name: ${friendly_name}
api:
encryption:
key: blah blah

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

Enable logging

logger:

ota:

  • platform: esphome
    password: “”

captive_portal:

esp32_ble_tracker:
scan_parameters:
# We currently use the defaults to ensure Bluetooth
# can co-exist with WiFi In the future we may be able to
# enable the built-in coexistence logic in ESP-IDF
active: true
interval: 1100ms
window: 1100ms

bluetooth_proxy:
active: true

ble_client:

  • mac_address: E4:38:19:22:93:C9
    id: BLE3025PH`

Logs
INFO ESPHome 2026.2.1
INFO Reading configuration /config/esphome/esp32-bluetooth-proxy-8965ac.yaml…
WARNING Found and merged multiple configurations for ota platform esphome port(s) [3232]
WARNING BLE components require 4 connection slot(s) but only 3 configured. Please set ‘max_connections: 4’ in the ‘esp32_ble’ component. Components: bluetooth_proxy, bluetooth_proxy, bluetooth_proxy, ble_client
INFO Starting log output from esp32-bluetooth-proxy-8965ac.local using esphome API
INFO Successfully resolved esp32-bluetooth-proxy-8965ac.local in 0.171s
INFO Successfully connected to esp32-bluetooth-proxy-8965ac @ 192.168.0.73 in 0.006s
INFO Successful handshake with esp32-bluetooth-proxy-8965ac @ 192.168.0.73 in 0.175s
[14:45:10.822][I][app:215]: ESPHome version 2026.2.1 compiled on 2026-02-25 12:18:17 +0000
[14:45:10.879][I][app:222]: ESP32 Chip: ESP32-S3 rev0.2, 2 core(s)
[14:45:10.880][C][logger:237]: Logger:
[14:45:10.880][C][logger:237]: Max Level: DEBUG
[14:45:10.880][C][logger:237]: Initial Level: DEBUG
[14:45:10.887][C][logger:244]: Log Baud Rate: 115200
[14:45:10.887][C][logger:244]: Hardware UART: USB_SERIAL_JTAG
[14:45:10.887][C][logger:254]: Task Log Buffer Size: 768 bytes
[14:45:10.887][C][bluetooth_proxy:124]: Bluetooth Proxy:
[14:45:10.887][C][bluetooth_proxy:124]: Active: YES
[14:45:10.887][C][bluetooth_proxy:124]: Connections: 3
[14:45:10.902][C][safe_mode.button:014]: Safe Mode Button ‘Safe Mode Boot’
[14:45:10.902][C][safe_mode.button:157]: Icon: ‘mdi:restart-alert’
[14:45:10.902][C][factory_reset.button:014]: Factory Reset Button ‘Factory reset’
[14:45:10.918][C][factory_reset.button:157]: Icon: ‘mdi:restart-alert’
[14:45:10.919][C][esp32_ble:650]: BLE:
[14:45:10.919][C][esp32_ble:650]: MAC address: 7C:2C:67:89:65:AE
[14:45:10.919][C][esp32_ble:650]: IO Capability: none
[14:45:10.919][C][esp32_ble_tracker:676]: BLE Tracker:
[14:45:10.933][C][esp32_ble_tracker:677]: Scan Duration: 300 s
[14:45:10.933][C][esp32_ble_tracker:677]: Scan Interval: 1100.0 ms
[14:45:10.933][C][esp32_ble_tracker:677]: Scan Window: 1100.0 ms
[14:45:10.933][C][esp32_ble_tracker:677]: Scan Type: ACTIVE
[14:45:10.933][C][esp32_ble_tracker:677]: Continuous Scanning: YES
[14:45:10.933][C][esp32_ble_tracker:685]: Scanner State: RUNNING
[14:45:10.933][C][esp32_ble_tracker:685]: Connecting: 0, discovered: 0, disconnecting: 0
[14:45:10.933][C][bluetooth_proxy.connection:091]: BLE Connection:
[14:45:10.996][C][esp32_ble_client:071]: Address:
[14:45:10.996][C][esp32_ble_client:071]: Auto-Connect: FALSE
[14:45:10.996][C][esp32_ble_client:071]: State: IDLE
[14:45:10.996][C][bluetooth_proxy.connection:091]: BLE Connection:
[14:45:10.996][C][esp32_ble_client:071]: Address:
[14:45:10.996][C][esp32_ble_client:071]: Auto-Connect: FALSE
[14:45:10.996][C][esp32_ble_client:071]: State: IDLE
[14:45:11.006][C][bluetooth_proxy.connection:091]: BLE Connection:
[14:45:11.006][C][esp32_ble_client:071]: Address:
[14:45:11.006][C][esp32_ble_client:071]: Auto-Connect: FALSE
[14:45:11.006][C][esp32_ble_client:071]: State: IDLE
[14:45:11.006][C][ble_client:026]: BLE Client:
[14:45:11.014][C][esp32_ble_client:071]: Address: E4:38:19:22:93:C9
[14:45:11.014][C][esp32_ble_client:071]: Auto-Connect: TRUE
[14:45:11.014][C][esp32_ble_client:071]: State: ESTABLISHED
[14:45:11.014][C][captive_portal:134]: Captive Portal:
[14:45:11.014][C][wifi:1450]: WiFi:
[14:45:11.014][C][wifi:1450]: Local MAC: 7C:2C:67:89:65:AC
[14:45:11.014][C][wifi:1450]: Connected: YES
[14:45:11.026][C][wifi:1202]: IP Address: 192.168.0.73
[14:45:11.026][C][wifi:1213]: SSID: [redacted]
[14:45:11.026][C][wifi:1213]: BSSID: [redacted]
[14:45:11.026][C][wifi:1213]: Hostname: ‘esp32-bluetooth-proxy-8965ac’
[14:45:11.026][C][wifi:1213]: Signal strength: -65 dB ▂▄▆█
[14:45:11.026][C][wifi:1213]: Channel: 9
[14:45:11.026][C][wifi:1213]: Subnet: 255.255.255.0
[14:45:11.026][C][wifi:1213]: Gateway: 192.168.0.1
[14:45:11.026][C][wifi:1213]: DNS1: 192.168.0.1
[14:45:11.026][C][wifi:1213]: DNS2: 0.0.0.0
[14:45:11.026][C][esphome.ota:075]: Over-The-Air updates:
[14:45:11.026][C][esphome.ota:075]: Address: esp32-bluetooth-proxy-8965ac.local:3232
[14:45:11.026][C][esphome.ota:075]: Version: 2
[14:45:11.096][C][esphome.ota:082]: Password configured
[14:45:11.096][C][safe_mode:022]: Safe Mode:
[14:45:11.096][C][safe_mode:022]: Successful after: 60s
[14:45:11.096][C][safe_mode:022]: Invoke after: 10 attempts
[14:45:11.096][C][safe_mode:022]: Duration: 300s
[14:45:11.096][C][safe_mode:039]: Bootloader rollback: supported
[14:45:11.117][C][web_server.ota:238]: Web Server OTA
[14:45:11.117][C][api:237]: Server:
[14:45:11.117][C][api:237]: Address: esp32-bluetooth-proxy-8965ac.local:6053
[14:45:11.117][C][api:237]: Listen backlog: 4
[14:45:11.117][C][api:237]: Max connections: 8
[14:45:11.117][C][api:244]: Noise encryption: YES
[14:45:11.131][C][mdns:177]: mDNS:
[14:45:11.131][C][mdns:177]: Hostname: esp32-bluetooth-proxy-8965ac
[14:47:20.210][D][esp32_ble_tracker:815]: Scan complete, set scanner state to IDLE.
[14:47:20.216][D][esp32_ble_tracker:240]: Starting scan, set scanner state to STARTING.

So from this it does indeed look like the BLE is not connected.

Log

[D][esp32_ble_tracker:815]: Scan complete, set scanner state to IDLE.
[15:46:24.235][D][esp32_ble_tracker:240]: Starting scan, set scanner state to STARTING.
[15:46:32.100][W][ble_sensor:141]: [Duracell PV Power] Cannot poll, not connected
[15:46:33.241][W][ble_sensor:141]: [Duracell Battery SoC] Cannot poll, not connected
[15:46:42.069][W][ble_sensor:141]: [Duracell PV Power] Cannot poll, not connected
[15:46:43.186][W][ble_sensor:141]: [Duracell Battery SoC] Cannot poll, not connected
[15:46:52.089][W][ble_sensor:141]: [Duracell PV Power] Cannot poll, not connected
[15:46:53.222][W][ble_sensor:141]: [Duracell Battery SoC] Cannot poll, not connected

Config

ble_client:
  - mac_address: E4:38:19:22:93:C9
    id: BLE3025PH
    auto_connect: true
  
 # - mac_address: 88:57:21:69:10:1A
 #   id : BLE_72538_219112D2P

sensor:
  - platform: ble_client
    ble_client_id: BLE3025PH
    type: characteristic
    service_uuid: 'ff00' # Example Service UUID
    characteristic_uuid: 'ff01' # Example Characteristic UUID (e.g. Battery SoC)
    name: "Duracell Battery SoC"
    unit_of_measurement: "%"
    device_class: "battery"
    state_class: "measurement"
    update_interval: 10s
    # You may need to add lambda filters to parse raw data
    # filters:
    #   - lambda: return x; 

  - platform: ble_client
    ble_client_id: BLE3025PH
    type: characteristic
    service_uuid: 'ff00'
    characteristic_uuid: 'ff02' # Example Power Usage
    name: "Duracell PV Power"
    unit_of_measurement: "W"
    device_class: "power"
    state_class: "measurement"
    update_interval: 10s

I don’t know anything about these batteries, but does it need to be put into pairing mode? Or is it already paired to another device?

Cheers for the reply, so they don’t go into pairing mode as such, they just connect up. Here’s what I’ve noted, if the ESP32 board is on I can’t connect via a galaxy tab bluetooth with the Dura-i bluetooth app as it advises the port is open and in use, when I power off the ESP32 I can connect perfecly fine so we know there is some sort of connection going on.

Is it the usual (frustrating) BLE limitation of only one session supported at a time?
ESP32 or Android, but not both at the same time.

indeed - yup was fully aware, I was just pointing out that the ESP32 card was connected as my android device couldn’t connect, even though it looks like my ESP32 isn’t connected and certainly isn’t pulling anything down.

This is the part that’s failing really, not getting the sensors, just failures.