Just a quick update - I was able to update the GL-S10 via OTA. My notes are below for posterity, or in case anybody else (or future me) stumbles across this.
Initially, I thought I’d try installing esphome
locally on my Macbook (via nix). I used the stock YAML file from the ESPHome devices page for the GL-S10, and ran:
esphome run s10.yaml --device 10.5.1.46
However, I ended up with a bunch of compile errors:
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
- framework-espidf @ 3.50402.0 (5.4.2)
- tool-cmake @ 3.30.2
- tool-esp-rom-elfs @ 2024.10.11
- tool-esptoolpy @ 5.0.2
- tool-mklittlefs @ 3.2.0
- tool-ninja @ 1.13.1
- tool-scons @ 4.40801.0 (4.8.1)
- toolchain-esp32ulp @ 2.35.0-20220830
- toolchain-xtensa-esp-elf @ 14.2.0+20241119
Creating a new virtual environment for IDF Python dependencies
Installing ESP-IDF's Python dependencies
Reading CMake configuration...
-- Found Git: /nix/store/4q2dd3sf6xq9bky0aq2wyp2pf958j0rz-git-2.51.0/bin/git (found version "2.51.0")
-- git rev-parse returned 'fatal: not a git repository (or any of the parent directories): .git'
-- The C compiler identification is GNU 14.2.0
-- The CXX compiler identification is GNU 14.2.0
-- The ASM compiler identification is GNU
-- Found assembler: /Users/victorhooi/.platformio/packages/toolchain-xtensa-esp-elf/bin/xtensa-esp32-elf-gcc
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Users/victorhooi/.platformio/packages/toolchain-xtensa-esp-elf/bin/xtensa-esp32-elf-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Users/victorhooi/.platformio/packages/toolchain-xtensa-esp-elf/bin/xtensa-esp32-elf-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Building ESP-IDF components for target esp32
Dependencies lock doesn't exist, solving dependencies.
..NOTICE: Updating lock file at /Users/victorhooi/Downloads/.esphome/build/gl-s10-bt-proxy/dependencies.lock
Processing 2 dependencies:
[1/2] espressif/mdns (1.8.2)
[2/2] idf (5.4.2)
-- Project sdkconfig file /Users/victorhooi/Downloads/.esphome/build/gl-s10-bt-proxy/sdkconfig.gl-s10-bt-proxy
-- Configuring incomplete, errors occurred!
fatal: not a git repository (or any of the parent directories): .git
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/Users/victorhooi/.platformio/penv/.espidf-5.4.2/lib/python3.13/site-packages/kconfgen/__main__.py", line 5, in <module>
from .core import main
File "/Users/victorhooi/.platformio/penv/.espidf-5.4.2/lib/python3.13/site-packages/kconfgen/core.py", line 29, in <module>
import esp_idf_kconfig.gen_kconfig_doc as gen_kconfig_doc
File "/Users/victorhooi/.platformio/penv/.espidf-5.4.2/lib/python3.13/site-packages/esp_idf_kconfig/gen_kconfig_doc.py", line 14, in <module>
import kconfiglib.core as kconfiglib
ModuleNotFoundError: No module named 'kconfiglib.core'; 'kconfiglib' is not a package
CMake Error at /Users/victorhooi/.platformio/packages/framework-espidf/tools/cmake/kconfig.cmake:209 (message):
Failed to run kconfgen
(/Users/victorhooi/.platformio/penv/.espidf-5.4.2/bin/python;-m;kconfgen;--list-separator=semicolon;--kconfig;/Users/victorhooi/.platformio/packages/framework-espidf/Kconfig;--sdkconfig-rename;/Users/victorhooi/.platformio/packages/framework-espidf/sdkconfig.rename;--config;/Users/victorhooi/Downloads/.esphome/build/gl-s10-bt-proxy/sdkconfig.gl-s10-bt-proxy;--env-file;/Users/victorhooi/Downloads/.esphome/build/gl-s10-bt-proxy/.pioenvs/gl-s10-bt-proxy/config.env).
Error 1
Call Stack (most recent call first):
/Users/victorhooi/.platformio/packages/framework-espidf/tools/cmake/build.cmake:691 (__kconfig_generate_config)
/Users/victorhooi/.platformio/packages/framework-espidf/tools/cmake/project.cmake:718 (idf_build_process)
CMakeLists.txt:3 (project)
============================================================================================= [FAILED] Took 28.53 seconds =============================================================================================
victorhooi@mbp16-personal ~/Downloads [1]> ping 10.5.1.45
I guess that’s one of the advantages of containerise systems, Docker etc…
. I could have setup Docker on my Mac, but I ended up just switching back to the server.
In this case, I used the ESPHome Device Builder (port 6052) (I think in theory you can use docker run to execute CLI against the container - but I didn’t want to risk breaking anything there). From the web UI clicked on “New Device”, then Continue, then “Import from File”, then selected the YAML file I had from above.
At first, I think it tried to find the device via a local DNS alias - either way, I had to specify the IP address. There were a bunch of posts online that mentioned using manual_ip - for Ethernet this would be:
ethernet:
manual_ip:
static_ip: <IP address>
However, this is not what I want, since then the device would actually be configured with a static IP address, not DHCP. It’s the use_address
setting you want (discussion):
ethernet:
use_address: <IP address>
The end result should be it successfully building, and pushing the firmware to the device, then rebooting:
Using FLASH_EXTRA_IMAGES from PlatformIO environment
Merging binaries into /config/.esphome/build/gl-s10-bt-proxy/.pioenvs/gl-s10-bt-proxy/firmware.factory.bin
Merging binaries with esptool
SHA digest in image updated.
Wrote 0xed410 bytes to file '/config/.esphome/build/gl-s10-bt-proxy/.pioenvs/gl-s10-bt-proxy/firmware.factory.bin', ready to flash to offset 0x0.
Successfully created /config/.esphome/build/gl-s10-bt-proxy/.pioenvs/gl-s10-bt-proxy/firmware.factory.bin
esp32_copy_ota_bin([".pioenvs/gl-s10-bt-proxy/firmware.bin"], [".pioenvs/gl-s10-bt-proxy/firmware.elf"])
Copied firmware to /config/.esphome/build/gl-s10-bt-proxy/.pioenvs/gl-s10-bt-proxy/firmware.ota.bin
========================= [SUCCESS] Took 13.03 seconds =========================
INFO Successfully compiled program.
INFO Connecting to 10.5.1.46 port 3232...
INFO Connected to 10.5.1.46
INFO Uploading /config/.esphome/build/gl-s10-bt-proxy/.pioenvs/gl-s10-bt-proxy/firmware.bin (906256 bytes)
Uploading: [============================================================] 100% Done...
INFO Upload took 3.17 seconds, waiting for result...
INFO OTA successful
INFO Successfully uploaded program.
INFO Starting log output from 10.5.1.46 using esphome API
INFO Successfully resolved gl-s10-bt-proxy @ 10.5.1.46 in 0.001s
WARNING Can't connect to ESPHome API for gl-s10-bt-proxy @ 10.5.1.46: Error connecting to [AddrInfo(family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, proto=6, sockaddr=IPv4Sockaddr(address='10.5.1.46', port=6053))]: [Errno 111] Connect call failed ('10.5.1.46', 6053) (SocketAPIError)
INFO Trying to connect to gl-s10-bt-proxy @ 10.5.1.46 in the background
INFO Successfully resolved gl-s10-bt-proxy @ 10.5.1.46 in 0.000s
INFO Successfully connected to gl-s10-bt-proxy @ 10.5.1.46 in 0.003s
INFO Successful handshake with gl-s10-bt-proxy-406228 @ 10.5.1.46 in 0.031s
[08:31:41.952][I][app:185]: ESPHome version 2025.9.2 compiled on Oct 2 2025, 08:31:10
[08:31:41.954][I][app:187]: Project gl-s10.bluetooth-proxy version 2.1
[08:31:41.955][C][status_led:018]: Status LED:
[08:31:41.957][C][status_led:019]: Pin: GPIO32
[08:31:41.959][C][logger:273]: Logger:
[08:31:41.959][C][logger:273]: Max Level: DEBUG
[08:31:41.959][C][logger:273]: Initial Level: DEBUG
I assume if I’m flashing a new device (i.e. doesn’t have ESPHome), then I will need to get ESPHome (e.g. via Docker) working locally on my Macbook, so that I can push directly via the debug pins, right?
And it seems like the ESPHome Device Builder not picking up the devices - is that working as intended, or not? Or should it be using mDNS and picking those up somehow?
I didn’t see the mdns
component listed on the stock GL-S10 configuration, but is it meant to be in there automatically, or should it work out of the box?