Drone Light Show Edition Support Suite for DroneBridge for ESP32.
This suite provides tools and scripts to manage, configure, and license DroneBridge for ESP32 devices, specifically for the Drone Light Show Edition (DLSE). Build the tools you need for DroneBridge DLSE! Make use of a lot of already existing scripts and the library as well as an OpenAPI description on the WiFi configuration endpoint!
Warning
The DroneBridge Commercial Support Suite is provided without warranty of any kind under the MIT License. Scripts may require adaptation to match your specific hardware setup, firmware versions, and environment. Always test the scripts before use and test with a small batch of devices first before running a full production operations.
-
Desktop Fleet Manager for monitoring and managing DLSE fleets
-
OpenAPI Definition
-
Functions to manage your DLSE devices
- Upload/Download DLSE License
- Get Activation Key via Wi-Fi
- Remote Reset of ESP32
- Scan for DLSE devices on the network
- Drone Log download
- Change settings via Wi-Fi
-
Ready to use scripts for:
- Batch Installation via Serial
- Batch Over-The-Air Firmware Update for DLSE Drones
- Batch Over-The-Air License Activation for DLSE Drones
- Batch Over-The-Air Reboot for DLSE Drones
- Python 3.10 or higher
- A DroneBridge account and license token (for licensing features)
Install the Fleet Manager and command-line tools from the latest GitHub release.
GitHub Releases: Check the Github Releases
python -m pip install pipx
python -m pipx ensurepathOpen a new terminal and install.
pipx install --force https://github.com/DroneBridge/DLSECommercialSupportSuite/releases/download/v1.1.1/dlsecommercialsupportsuite-1.1.1-py3-none-any.whlFor newer releases, replace v1.1.1 and the wheel filename with the version shown on the GitHub Releases page.
Open a new terminal and verify the commands are available:
dlse-activate --help
dlse-reboot --help
dlse-update --help
dlse-install --help
dlse-uiThe desktop Fleet Manager provides MAVLink and HTTP discovery, fleet table and matrix views, device inspection, settings management, OTA licensing, reboot, firmware updates, and optional UniFi observations. Serial flashing remains a command-line workflow. The fleet table shows the Operation and Progress columns by default; use Configure Columns to adjust the visible columns and their order. In the Settings panel, checked devices can be edited together for settings they all report. Differing values start blank with a Mixed values hint, and only fields the operator edits are applied. Each settings update is confirmed and reboots its target devices.
Start the application after installation with:
dlse-uiWindows x64 is the validated desktop platform for v1.1.1. Linux and macOS are expected to work but are not release-qualified. Python 3.10 and newer are supported; UniFi integration is guaranteed on Python 3.10 through 3.13 and is best-effort on newer Python versions.
Before fleet operations, ensure the ESP32 devices are reachable and stop Skybrush Live when the selected workflow uses MAVLink ports. Test settings, activation, reboot, and OTA operations on a small non-production fleet first.
Run the installed commands from the folder where you want operational files to live. Relative paths for firmware release folders, settings CSV files, logs/, and received_licenses/ are resolved from your current terminal folder. Firmware release folders are external downloads and are not bundled into the Python package.
After installation, the following applications are available:
Activates DLSE ESP32s over Wi-Fi:
dlse-activateReboots DLSE ESP32s over Wi-Fi:
dlse-rebootUpdates the DLSE firmware of ESP32s over Wi-Fi:
dlse-update --helpFull installation, activation and configuration script for flashing a fleet of DLSE ESP32s over serial:
dlse-install --helpUser interface application for convenient DLSE settings management. Covers the functionality of dlse-update, dlse-reboot, and dlse-activate. Can directly connect to UniFi Gateways:
dlse-uidlse-activate --token <YOUR_SECRET_TOKEN> --subnetmask 192.168.1.0/24
dlse-activate --token <YOUR_SECRET_TOKEN> -e
dlse-reboot --subnetmask 192.168.1.0/24
dlse-reboot --force-rest
dlse-update --release-folder DroneBridge_ESP32DLSE_BETA5 --subnetmask 192.168.1.0/24
dlse-install --token <YOUR_SECRET_TOKEN> --release-folder DroneBridge_ESP32DLSE_BETA5 --settings-file my_parameters/dlse_my_params.csv --start-index 55Before running hardware workflows, stop Skybrush Live when using MAVLink discovery, reboot, or OTA update paths. Serial flashing also requires OS access to the ESP32 serial port.
Before network operations, make sure the ESP32s are reachable, configured UDP ports match, and Skybrush Live is stopped when MAVLink ports are required. Test activation, settings, reboot, and OTA operations on a small hardware batch before using them on a production fleet.
This script allows for batch processing of drones for a show.
Run it and plug in your ESP32s one by one. It will flash, activate & configure your DLSE ESP32 all in one go!
Set up one ESP32 with a working configuration to serve as the template for all your show drones.
- Use the online flashing tool to install DLSE onto your ESP32.
- Power-cycle the ESP32 and connect to the Wi-Fi access point it creates:
- SSID:
DroneBridge for ESP32 - Password:
dronebridge
- SSID:
- Open the web interface in your browser at 192.168.2.1.
- Configure the ESP32 to match your show drone setup and verify everything works.
- At the bottom of the ESP32 web interface, copy the activation key. Then use it together with your secret token from drone-bridge.com to generate a license file via the online generator.
- Upload the license file in the ESP32 web interface under Manage License.
- Export your settings from the ESP32 web interface — you will reference this file in the batch script later.
Follow the setup commands described above to install the toolchain on your machine.
Optional: Download the latest DLSE release binaries and extract them into the DLSECommercialSupportSuite folder.
The support library can also list the DLSE releases available to your account via
the DroneBridge license server and download a selected release zip into the local
dlse_releases/ cache.
The batch scripts still accept --release-folder, so you can continue to point them at any manually downloaded and
extracted release root folder.
From this point on the process is fully automated. Run the following command to install on all ESP32 serial devices connected to your computer:
dlse-install \
--token <YOUR_SECRET_TOKEN> \
--release-folder "DroneBridge_ESP32DLSE_BETA3" \
--settings-file my_parameters/dlse_my_params.csv \
--start-index 55To request 60-day evaluation licenses instead of regular activated licenses, add -e:
dlse-install \
--token <YOUR_SECRET_TOKEN> \
-e \
--release-folder "DroneBridge_ESP32DLSE_BETA3" \
--settings-file my_parameters/dlse_my_params.csv \
--start-index 55| Parameter | Description |
|---|---|
--token |
Your secret token from drone-bridge.com. You can also set DRONEBRIDGE_SECRET_TOKEN; --token overrides the environment variable. |
-e, --evaluation |
Request 60-day evaluation licenses instead of regular activated licenses. Evaluation licenses require license server access and are not cached in received_licenses/. |
--release-folder |
Path to the folder containing the DLSE firmware binaries you downloaded in Step 3. If omitted, the script asks you to choose a cached release from dlse_releases/, download an available online release, or enter a manual folder path. |
--settings-file |
Path to the settings file you exported from the ESP32 web interface in Step 1. If omitted while using the release selector, the script uses db_show_params.csv from the selected release. |
--start-index |
A numeric postfix appended to ssid_ap, wifi_hostname, and ip_sta for each flashed unit. For example, with --start-index 33, the access point SSID becomes <YOUR_SSID>33 and the static IP of the ESP32 will be 192.168.50.33 if your config has set 192.168.50.1 as static IP. |
- Automatically requests a license from the DroneBridge license server and registers it with your account.
- Flashes the DLSE firmware together with your exported settings and the generated license.
- Falls back to offline activation if a local license file for the ESP32 is already present in
/received_licenses, or if the device has previously been activated (the existing license is pulled and re-applied before the new firmware is written). - In evaluation mode, temporary 60-day licenses require the license server and are not stored in
/received_licenses. - Logs all actions to
/logs.
Note
Running the script multiple times for the same ESP32 (identified by its activation key) will not consume additional license credits. Re-generating a license is always free.
Update the firmware of your drone swarm over the air. This is the CLI workflow, you can do it using the user interface as well.
Caution
Requires Skybrush Live to be turned off. Requires TX & RX GPIO pins to be configured and TRAIL mode being not expired in order to detect the ESP32 (early DLSE releases)
dlse-update --release-folder "DroneBridge_ESP32DLSE_BETA3" --subnetmask "192.168.1.0/24" --esp32localbrcstport 14555 --esp32remotebrcstport 14550Or in case you want to target only ESP32s running a specific target version:
dlse-update --release-folder "DroneBridge_ESP32DLSE_BETA3" --subnetmask "192.168.1.0/24" --target-version "1.0.0-beta.3" --esp32localbrcstport 14555 --esp32remotebrcstport 14550If a parameter is not supplied, all detected devices will be upgraded.
| Parameter | Description |
|---|---|
--release-folder |
Path to the root directory of the release, e.g. DroneBridge_ESP32DLSE_BETA3. If omitted, the script asks you to choose a cached release from dlse_releases/, download an available online release, or enter a manual folder path. |
--token |
Optional token used only for listing and downloading releases when --release-folder is omitted. You can also set DRONEBRIDGE_SECRET_TOKEN; --token overrides the environment variable. |
--subnetmask |
IP address range to scan for devices. |
--target-version |
Only upgrade ESP32s running this specific DLSE version — all other devices are skipped. Use "0.0.0-dev.1" to target DLSE Beta4 and earlier, as all those versions identify with that version string. |
--esp32localbrcstport |
As configured in the web interface of the ESP32 (open on your ESP32) (udp_local_port) - Default: 14555 |
--esp32remotebrcstport |
As configured in the web interface of the ESP32 (open on your GCS) (wifi_brcst_port) - Default: 14550 |
Created log file logs\dlse_ota_update_log_20260304_231534.log
[2026-03-04 23:15:34] Using release folder: DroneBridge_ESP32DLSE_BETA4
[2026-03-04 23:15:34] Found binaries for ESP32C3 in 'DroneBridge_ESP32DLSE_BETA4\esp32c3_generic'
[2026-03-04 23:15:34] Found binaries for ESP32C5 in 'DroneBridge_ESP32DLSE_BETA4\esp32c5_generic'
[2026-03-04 23:15:34] Found binaries for ESP32C6 in 'DroneBridge_ESP32DLSE_BETA4\esp32c6_generic'
[2026-03-04 23:15:34] ✅ All required release binaries are present in 'DroneBridge_ESP32DLSE_BETA4'
[2026-03-04 23:15:34] Starting OTA update of all ESP32 devices in the local network
[2026-03-04 23:15:34] *** TURN OFF SKYBRUSH LIVE to free up the broadcast port ***
[2026-03-04 23:15:34] Your settings and license will be unaffected by this update.
[2026-03-04 23:15:34] Scanning network 192.168.1.0/24 (Broadcast: 192.168.1.255) for ESP32 devices...
[2026-03-04 23:15:37] Found 2 ESP32 (DLSE) device(s).
[2026-03-04 23:15:37] [ ] IP 192.168.1.174 SYS_ID: 174 - firmware Version 1.0.0-beta.4
[2026-03-04 23:15:37] [X] IP 192.168.1.206 SYS_ID: 206 - firmware Version 0.0.0-dev.1
Do you want to proceed with the OTA update for the selected [x] devices? (y/n): y
[2026-03-04 23:15:49] Skipping device 192.168.1.174 as it is not running the required target version 0.0.0-dev.1
[2026-03-04 23:15:49] Updating device 192.168.1.206 ...
[2026-03-04 23:15:49] Requesting system info from http://192.168.1.206/api/system/info (attempt 1/4)...
Request successful.
{"status": "success", "msg": "HTTP OTA www update successful!"}
Uploading 'DroneBridge_ESP32DLSE_BETA4\esp32c6_generic\db_esp32.bin' to 'http://192.168.1.206/update/firmware' with progress...
Uploading: 100%|██████████| 1.11M/1.11M [00:14<00:00, 77.4kB/s]
✅ Upload successful!
Status Code: 200
{"status": "success", "msg": "HTTP OTA app update successful! Rebooting ..."}
[2026-03-04 23:16:09] OTA update finished. 1 devices updated successfully. 0 devices failed to update.
[2026-03-04 23:16:09]
⚠️ Failed devices:
(none)
[2026-03-04 23:16:09]
✅ Successful devices:
- {'key': ('192.168.1.206', 206, 240), 'ip': '192.168.1.206', 'sys_id': 206, 'comp_id': 240, 'middleware_sw_version': 0, 'os_sw_version': 0, 'board_version': 0, 'vendor_id': 0, 'product_id': 0, 'mac': 0, 'flight_sw_version': {'major': 0, 'minor': 0, 'patch': 0, 'release_num': 1, 'type': 'dev', 'version_str': '0.0.0-dev.1'}}
This is the CLI workflow. You can also activate Over-The-Air using the user interface application.
Activates all ESP32s on the subnet by requesting a license from the license server and installing it via a WiFi connection. Requires Skybrush Live to be turned off.
For the most robust discovery behavior, run the script with --force-rest. This skips MAVLink discovery and uses an HTTP scan of the selected --subnetmask with GET /api/system/info, 20 concurrent probes, and a 1 second per-host timeout. If --force-rest is omitted, discovery first uses MAVLink UDP broadcast and falls back to the same HTTP scan only when no devices respond.
Caution
Requires Skybrush Live to be turned off. Requires TX & RX GPIO pins to be configured and TRAIL mode being not expired in order to detect the ESP32
dlse-activate --token <YOUR_SECRET_TOKEN> --force-rest --subnetmask "192.168.1.0/24" --esp32localbrcstport 14555 --esp32remotebrcstport 14550To request 60-day evaluation licenses only, add -e:
dlse-activate --token <YOUR_SECRET_TOKEN> --force-rest -e --subnetmask "192.168.1.0/24" --esp32localbrcstport 14555 --esp32remotebrcstport 14550After activating the ESP32s you might need to reboot them to re-activate the MAVLink processing up to DLSE BETA6 releases. Do it manually or use the Batch Over-The-Air Reboot Script shown further down below.
--token: Your secret activation token received fromdrone-bridge.com/dlseuser dashboard--force-rest: Skip MAVLink discovery and scan the selected IP range with the ESP32 REST API. Recommended for the most robust discovery behavior.-e,--evaluation: Request 60-day evaluation licenses instead of activated licenses. Evaluation licenses are temporary and are not stored inreceived_licenses/.--subnetmask: IP address range to scan for devices to activate--esp32localbrcstport: As configured in the web interface of the ESP32 (open on your ESP32) (udp_local_port)--esp32remotebrcstport: As configured in the web interface of the ESP32 (open on your GCS) (wifi_brcst_port)
[2026-03-04 23:34:06] Starting DLSE Over-The-Air activation service. License storage: received_licenses
[2026-03-04 23:34:08] Scanning network 192.168.1.0/24 (Broadcast: 192.168.1.255) for ESP32 devices...
[2026-03-04 23:34:10] Found 0 ESP32 (DLSE) device(s).
[2026-03-04 23:34:18] Scanning network 192.168.1.0/24 (Broadcast: 192.168.1.255) for ESP32 devices...
[2026-03-04 23:34:20] Found 0 ESP32 (DLSE) device(s).
[2026-03-04 23:34:28] Scanning network 192.168.1.0/24 (Broadcast: 192.168.1.255) for ESP32 devices...
[2026-03-04 23:34:30] Found 1 ESP32 (DLSE) device(s).
[2026-03-04 23:34:31] Requesting license from https://drone-bridge.com/api/license/generate... (attempt 1/3)
[2026-03-04 23:34:31] ✅ License generated and saved to 'received_licenses/mKM*****DQIA.dlselic'
[2026-03-04 23:34:31] Validating license...
[2026-03-04 23:34:31] ✅ License signature is valid.
[2026-03-04 23:34:31] ✅ License matches activation key mKM*****DQIA
[2026-03-04 23:34:32] 🔑 Activated 192.168.1.149 - mKM*****DQIA 🔑
[2026-03-04 23:34:38] Scanning network 192.168.1.0/24 (Broadcast: 192.168.1.255) for ESP32 devices...
[2026-03-04 23:34:40] Found 1 ESP32 (DLSE) device(s).
[2026-03-04 23:34:42] 👋 Exiting auto license activation tool.
[2026-03-04 23:34:42] Session total: 1 devices activated or already activated
[2026-03-04 23:34:42] All licenses stored in: received_licenses
[2026-03-04 23:34:42] Processed IPs: {'192.168.1.149'}
[2026-03-04 23:34:42] Processed activation keys: {'mKM*****DQIA'}Reboot all detected ESP32 DLSE devices in one confirmed operation. The script first tries MAVLink discovery. If at least one ESP32 is discovered, it sends one MAVLink broadcast reboot command to the subnet broadcast address. If MAVLink discovers no devices, it falls back to HTTP discovery with GET /api/system/info and reboots each detected device by sending {} to POST /api/settings.
Caution
Requires Skybrush Live to be turned off when using MAVLink discovery or reboot, because the broadcast port must be available. The script asks for confirmation before sending reboot commands. Test with a small batch before rebooting a full fleet.
dlse-reboot --subnetmask "192.168.1.0/24" --esp32localbrcstport 14555 --esp32remotebrcstport 14550To force the slower but more reliable REST path for both discovery and reboot:
dlse-reboot --force-rest --subnetmask "192.168.1.0/24" --http-timeout 1.0 --http-workers 20--subnetmask: IP address range to scan for devices to reboot. Default:192.168.1.0/24.--esp32localbrcstport: As configured in the ESP32 web interface (open on your ESP32) (udp_local_port). Default:14555.--esp32remotebrcstport: As configured in the ESP32 web interface (open on your GCS) (wifi_brcst_port). Default:14550.--force-rest: Skip MAVLink discovery and reboot through HTTP scan plusPOST /api/settings.--http-timeout: Per-host HTTP timeout for REST discovery and reboot requests. Default:1.0seconds.--http-workers: Maximum concurrent HTTP scan and reboot workers. Default:20, capped at64.
dlse-install/batch_install_dlse_allinone.py: Flashes board over a serial link. Batch installation script that takes care of it all. Applying settings, flashing & activation. It can pull license from the ESP32 prior to flashing in case the license server is not available.dlse-activate/batch_ota_license_activation.py: Installs DLSE licenses over the air (OTA) for all detected devices on the specified subnet.dlse-reboot/batch_ota_reboot.py: Reboots all detected ESP32 DLSE devices using MAVLink broadcast first, with an HTTP settings-endpoint fallback or forced REST mode.dlse-update/batch_ota_update_allinone.py: Updates firmware over the air for all detected devices on the specified subnet and with the specified firmware version.DroneBridgeCommercialSupportSuite.py: The main library file containing helper functions.
example_esp32_get_license.py: Standalone script to request a license file using an activation key.example_esp32_ota_update.py: Performs an Over-The-Air (OTA) firmware update for all detected ESP32 DLSE devices. Turn off Skybrush Live to allow port binding by the scriptexample_esp32_download_log.py&example_esp32_download_log_MAVSDK.py: Examples for downloading logs from the flight controller via the ESP32 bridge.
Find the DroneBridge DLSE OpenAPI description here: api_definition/openapi_definition.yaml
If you plan to write your own scripts using the DLSE Commercial Support Suite Framework, it is recommended to install the following developer setup.
-
Clone the repository:
git clone --recursive https://github.com/DroneBridge/DLSECommercialSupportSuite.git cd DLSECommercialSupportSuite -
Install the package and dependencies:
pip install . -
Run scripts directly from the source checkout when developing or debugging:
python batch_ota_license_activation.py --token <YOUR_SECRET_TOKEN> python batch_ota_reboot.py python batch_ota_update_allinone.py --release-folder DroneBridge_ESP32DLSE_BETA5 python batch_install_dlse_allinone.py --token <YOUR_SECRET_TOKEN> --release-folder DroneBridge_ESP32DLSE_BETA5 --settings-file my_parameters/dlse_my_params.csv --start-index 55
The default automated test run skips checks that require a physical ESP32 or the production license server. Set DLSE_RUN_HARDWARE_TESTS=1 only with a test ESP32 connected, optionally selecting its port with DLSE_TEST_SERIAL_PORT (default COM18). Set DLSE_RUN_NETWORK_TESTS=1 to include the live license-server availability check.
Run the non-hardware test suite from an environment containing the project dependencies:
python -m unittest discover -s test -p "Test*.py"Build and validate the wheel and source distribution:
python -m pip install build twine
python -m build
python -m twine check dist/*If an existing local build/ folder shadows the Python build module, run the command from the parent folder instead:
python -m build DLSECommercialSupportSuiteSmoke-test the v1.1.1 wheel in an isolated pipx environment before publishing:
pipx install --force dist/dlsecommercialsupportsuite-1.1.1-py3-none-any.whl
dlse-activate --help
dlse-reboot --help
dlse-update --help
dlse-install --help
dlse-uiVerify the UI opens with its bundled fonts and icons before attaching the wheel, source archive, and SHA-256 checksums to the manually created GitHub Release.
All images except for the user interface are for illustration purposes only and are generated by Google Gemini (AI)
MIT License