DLSE Commercial Support Suite

September 24, 2026 · View on GitHub

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.

Gemini_Generated_Image_3phf5r3phf5r3phf

Features

  • 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

Prerequisites

  • Python 3.10 or higher
  • A DroneBridge account and license token (for licensing features)

Installation & Quick Start

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 ensurepath

Open 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.whl

For 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-ui

User Interface - Fleet Manager

The 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.

DLSE_UI1

Start the application after installation with:

dlse-ui

Windows 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.

Operational Folder

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.

Command Line Usage

After installation, the following applications are available:

Activates DLSE ESP32s over Wi-Fi:

dlse-activate

Reboots DLSE ESP32s over Wi-Fi:

dlse-reboot

Updates the DLSE firmware of ESP32s over Wi-Fi:

dlse-update --help

Full installation, activation and configuration script for flashing a fleet of DLSE ESP32s over serial:

dlse-install --help

User 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-ui

Example usage

dlse-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 55

Before 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.

CLI: Automated DLSE Batch Installation

Gemini_Generated_Image_kvejvukvejvukvej 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!

Step 1 — Manually configure your reference ESP32

Set up one ESP32 with a working configuration to serve as the template for all your show drones.

  1. Use the online flashing tool to install DLSE onto your ESP32.
  2. Power-cycle the ESP32 and connect to the Wi-Fi access point it creates:
    • SSID: DroneBridge for ESP32
    • Password: dronebridge
  3. Open the web interface in your browser at 192.168.2.1.
  4. Configure the ESP32 to match your show drone setup and verify everything works.
  5. 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.
  6. Upload the license file in the ESP32 web interface under Manage License.
  7. Export your settings from the ESP32 web interface — you will reference this file in the batch script later.

Step 2 — Set up the DLSE Commercial Support Toolchain

Follow the setup commands described above to install the toolchain on your machine.


Step 3 — Download the DLSE firmware binaries

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.


Step 4 — Run the batch installation script

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 55

To 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

Parameters

ParameterDescription
--tokenYour secret token from drone-bridge.com. You can also set DRONEBRIDGE_SECRET_TOKEN; --token overrides the environment variable.
-e, --evaluationRequest 60-day evaluation licenses instead of regular activated licenses. Evaluation licenses require license server access and are not cached in received_licenses/.
--release-folderPath 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-filePath 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-indexA 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.

What the script does

  • 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.

CLI: Batch Over-The-Air Firmware Update for DLSE Devices

Gemini_Generated_Image_o10ugso10ugso10u

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 14550

Or 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 14550

If a parameter is not supplied, all detected devices will be upgraded.

Parameters

ParameterDescription
--release-folderPath 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.
--tokenOptional 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.
--subnetmaskIP address range to scan for devices.
--target-versionOnly 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.
--esp32localbrcstportAs configured in the web interface of the ESP32 (open on your ESP32) (udp_local_port) - Default: 14555
--esp32remotebrcstportAs configured in the web interface of the ESP32 (open on your GCS) (wifi_brcst_port) - Default: 14550

Example Output

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'}}

CLI: Batch Over-The-Air License Activation for DLSE Drones

Gemini_Generated_Image_scabxascabxascab 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 14550

To 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 14550

After 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.

Parameters

  • --token: Your secret activation token received from drone-bridge.com/dlse user 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 in received_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)

Example Output

[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'}

CLI: Batch Over-The-Air Reboot for DLSE Devices

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 14550

To 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

Parameters

  • --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 plus POST /api/settings.
  • --http-timeout: Per-host HTTP timeout for REST discovery and reboot requests. Default: 1.0 seconds.
  • --http-workers: Maximum concurrent HTTP scan and reboot workers. Default: 20, capped at 64.

Key Scripts

  • 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.

Examples on individual 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 script
  • example_esp32_download_log.py & example_esp32_download_log_MAVSDK.py: Examples for downloading logs from the flight controller via the ESP32 bridge.

OpenAPI Description

Find the DroneBridge DLSE OpenAPI description here: api_definition/openapi_definition.yaml

Installation for Development Setups

If you plan to write your own scripts using the DLSE Commercial Support Suite Framework, it is recommended to install the following developer setup.

  1. Clone the repository:

    git clone --recursive https://github.com/DroneBridge/DLSECommercialSupportSuite.git
    cd DLSECommercialSupportSuite
    
  2. Install the package and dependencies:

    pip install .
    
  3. 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.

Release Build Checklist

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 DLSECommercialSupportSuite

Smoke-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-ui

Verify 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.

Images

All images except for the user interface are for illustration purposes only and are generated by Google Gemini (AI)

License

MIT License