Automatically flash OpenShock firmware to ESP32 devices
Project description
OpenShock Auto-Flasher 
Automatically flash OpenShock firmware to ESP32 devices when they are plugged in. Features color-coded terminal backgrounds to indicate the current status at a glance.
Features
- Automatic detection of newly connected devices
- Color-coded status with background colors:
- Blue - Waiting for device
- Yellow - Flashing in progress
- Green - Flash complete
- Red - Error occurred
- Firmware verification using SHA256 checksums
- Multiple channels - stable, beta, or develop
- Post-flash commands - Send serial commands to device after flashing
- Continuous mode - flash multiple devices in sequence
- Optional flash erase before flashing
- Smart text wrapping - Long messages wrap cleanly without cutting words
- Dynamic boards list - View available boards for any channel via
--help
Requirements
- Python 3.12 or higher
- Linux, macOS, or Windows
- USB connection to ESP32 devices
Installation
From GitHub with pipx (Recommended)
Install directly from the latest GitHub version:
pipx install --force 'git+https://github.com/NanashiTheNameless/OpenShock-AutoFlasher@main'
This makes the OPSH-AutoFlash command available system-wide.
Alternative: From PyPI
If you prefer a release from PyPI:
pipx install OpenShock-AutoFlasher
From Source
- Clone this repository:
git clone https://github.com/NanashiTheNameless/OpenShock-AutoFlasher.git
cd OpenShock-AutoFlasher
- Install dependencies:
pip3 install -r requirements.txt
Usage
Basic Usage
Flash devices using the stable firmware channel:
OPSH-AutoFlash --board <board-name>
View available boards for different channels:
OPSH-AutoFlash --help # Shows boards for stable channel
OPSH-AutoFlash --channel beta --help # Shows boards for beta channel
OPSH-AutoFlash -C develop --help # Shows boards for develop channel
Command-Line Options
| Option | Short | Description | Default |
|---|---|---|---|
--channel |
-C |
Firmware channel: stable, beta, or develop |
stable |
--version |
-V |
Use specific firmware version (overrides channel) | - |
--board |
-B |
Board type (required) | - |
--erase |
-E |
Erase flash before flashing | false |
--no-auto |
-N |
Disable auto-flash (just detect devices) | false |
--post-flash |
-P |
Serial command to send after flashing (can use multiple times) | - |
--alert |
-A |
Beep audibly when flashing completes | false |
Examples
Flash with stable firmware:
OPSH-AutoFlash --board Wemos-D1-Mini-ESP32
Flash with specific firmware version:
OPSH-AutoFlash --version 1.4.0 --board Wemos-D1-Mini-ESP32
Flash with beta firmware and erase existing data:
OPSH-AutoFlash --channel beta --board Wemos-D1-Mini-ESP32 --erase
Flash and send post-flash commands to device:
OPSH-AutoFlash --board Wemos-D1-Mini-ESP32 \
--post-flash "help" \
--post-flash "version" \
--post-flash "status"
Use development firmware with audio alert:
OPSH-AutoFlash --channel develop --board Wemos-D1-Mini-ESP32 --alert
Detect devices without auto-flashing:
OPSH-AutoFlash --board Wemos-D1-Mini-ESP32 --no-auto
How It Works
- Fetches the latest firmware version from firmware.openshock.org
- Validates the specified board type
- Monitors USB ports for newly connected devices
- Downloads firmware binary and checksum in parallel
- Verifies firmware integrity using SHA256
- Flashes the device using esptool
- Verifies the flash was successful
- Executes post-flash commands over serial (if specified)
- Repeats for additional devices (continuous mode)
The tool uses esptool with optimized settings and can send serial commands to the device after flashing for automated configuration or testing.
Supported Boards
The tool supports multiple ESP32-based boards. To view the current list of available boards, run:
OPSH-AutoFlash --help # Stable channel boards
OPSH-AutoFlash --channel beta --help # Beta channel boards
OPSH-AutoFlash -c develop --help # Develop channel boards
Common board types include:
Wemos-D1-Mini-ESP32Wemos-Lolin-S2-MiniWemos-Lolin-S3Wemos-Lolin-S3-MiniWaveshare_esp32_s3_zeroPishock-2023Pishock-Lite-2021Seeed-Xiao-ESP32C3Seeed-Xiao-ESP32S3DFRobot-Firebeetle2-ESP32EOpenShock-Core-V1OpenShock-Core-V2
Note: Different channels may have different board support. Always check the help output for your selected channel.
Permissions (Linux)
On Linux, you may need to add your user to the dialout group to access serial ports:
sudo usermod -a -G dialout $USER
Then log out and log back in for the changes to take effect.
Troubleshooting
Device not detected:
- Ensure the device is in bootloader mode
- Check USB cable connection
- Verify device appears in system (check
dmesgon Linux or Device Manager on Windows)
Permission errors:
- Add user to dialout/uucp group (Linux)
- Run with appropriate permissions
- Check USB cable supports data transfer (not charge-only)
Verification fails:
- Try using
--eraseflag to erase flash first - Check for hardware issues
- Try a different USB port or cable
Development
Running Tests
The project includes a comprehensive test suite using pytest. To run the tests:
- Install development dependencies:
pip install -e .[dev]
- Run the test suite:
pytest tests/ -v
- Run tests with coverage:
pytest tests/ -v --cov=openshock_autoflasher --cov-report=term-missing
Code Quality
The project uses several tools for code quality:
- Black - Code formatting
- Flake8 - Linting
- Mypy - Type checking
Run code quality checks:
# Format code
black openshock_autoflasher/ tests/
# Lint code
flake8 openshock_autoflasher/ tests/
# Type check
mypy openshock_autoflasher/
Project Structure
The codebase is modular and organized as follows:
openshock_autoflasher/- Main packageconstants.py- Configuration constantsstyles.py- Terminal styling and colorsflasher.py- Core AutoFlasher class with flashing logiccli.py- Command-line interface and argument parsing__init__.py- Package initialization__main__.py- Module entry point
tests/- Test suitetest_constants.py- Tests for constants moduletest_styles.py- Tests for styles moduletest_flasher.py- Tests for flasher moduletest_cli.py- Tests for CLI module
Continuous Integration
The project uses GitHub Actions for CI/CD:
- Tests Workflow - Runs tests on Ubuntu, Windows, and macOS with Python 3.12-3.14
- Publish Workflow - Publishes to PyPI on release
License
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). See LICENSE file for details.
Contributing
Contributions are welcome! Please feel free to submit issues or pull requests.
Disclaimer
This tool is provided as-is. Use at your own risk. Always ensure you have backups of any important configurations before flashing firmware.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file openshock_autoflasher-0.1.3.tar.gz.
File metadata
- Download URL: openshock_autoflasher-0.1.3.tar.gz
- Upload date:
- Size: 27.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd3eadc96c17628b95bdca27b64f282501c2e8170372ec10543011bba506f72d
|
|
| MD5 |
a49aea5fd2d6f2451ff6603ee9a51a33
|
|
| BLAKE2b-256 |
7076edeb2201f00509f6961226926479a955eb0828f8e04f1c61ef08a283c744
|
Provenance
The following attestation bundles were made for openshock_autoflasher-0.1.3.tar.gz:
Publisher:
python-publish.yml on NanashiTheNameless/OpenShock-AutoFlasher
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
openshock_autoflasher-0.1.3.tar.gz -
Subject digest:
cd3eadc96c17628b95bdca27b64f282501c2e8170372ec10543011bba506f72d - Sigstore transparency entry: 945014233
- Sigstore integration time:
-
Permalink:
NanashiTheNameless/OpenShock-AutoFlasher@2585c9b9e578dbcd98e122900b028e40c3acbd33 -
Branch / Tag:
refs/tags/0.1.3 - Owner: https://github.com/NanashiTheNameless
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@2585c9b9e578dbcd98e122900b028e40c3acbd33 -
Trigger Event:
release
-
Statement type:
File details
Details for the file openshock_autoflasher-0.1.3-py3-none-any.whl.
File metadata
- Download URL: openshock_autoflasher-0.1.3-py3-none-any.whl
- Upload date:
- Size: 25.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af3e196451c498d75a42da1647df6fdf043b753fe1bd2e850d87258db1ab3685
|
|
| MD5 |
cfc7df10f1b34cb7ba09cae362ce6161
|
|
| BLAKE2b-256 |
7976cf330d34c7869ac1854b6124eb0d4e51c6798792daae60a2abe991a45c0d
|
Provenance
The following attestation bundles were made for openshock_autoflasher-0.1.3-py3-none-any.whl:
Publisher:
python-publish.yml on NanashiTheNameless/OpenShock-AutoFlasher
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
openshock_autoflasher-0.1.3-py3-none-any.whl -
Subject digest:
af3e196451c498d75a42da1647df6fdf043b753fe1bd2e850d87258db1ab3685 - Sigstore transparency entry: 945014282
- Sigstore integration time:
-
Permalink:
NanashiTheNameless/OpenShock-AutoFlasher@2585c9b9e578dbcd98e122900b028e40c3acbd33 -
Branch / Tag:
refs/tags/0.1.3 - Owner: https://github.com/NanashiTheNameless
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@2585c9b9e578dbcd98e122900b028e40c3acbd33 -
Trigger Event:
release
-
Statement type: