5.9 KiB
5.9 KiB
WLED - ESP32/ESP8266 LED Controller Firmware
WLED is a fast and feature-rich implementation of an ESP32 and ESP8266 webserver to control NeoPixel (WS2812B, WS2811, SK6812) LEDs and SPI-based chipsets. The project consists of C++ firmware for microcontrollers and a modern web interface.
Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.
Working Effectively
Initial Setup
- Install Node.js 20+ (specified in
.nvmrc): Check your version withnode --version - Install dependencies:
npm install(takes ~5 seconds) - Install PlatformIO for hardware builds:
pip install -r requirements.txt(takes ~60 seconds)
Build and Test Workflow
- ALWAYS build web UI first:
npm run build-- takes 3 seconds. NEVER CANCEL. - Run tests:
npm test-- takes 40 seconds. NEVER CANCEL. Set timeout to 2+ minutes. - Development mode:
npm run dev-- monitors file changes and auto-rebuilds web UI - Hardware firmware build:
pio run -e [environment]-- takes 15+ minutes. NEVER CANCEL. Set timeout to 30+ minutes.
Build Process Details
The build has two main phases:
-
Web UI Generation (
npm run build):- Processes files in
wled00/data/(HTML, CSS, JS) - Minifies and compresses web content
- Generates
wled00/html_*.hfiles with embedded web content - CRITICAL: Must be done before any hardware build
- Processes files in
-
Hardware Compilation (
pio run):- Compiles C++ firmware for various ESP32/ESP8266 targets
- Common environments:
nodemcuv2,esp32dev,esp8266_2m - List all targets:
pio run --list-targets
Validation and Testing
Web UI Testing
- ALWAYS validate web UI changes manually:
- Start local server:
cd wled00/data && python3 -m http.server 8080 - Open
http://localhost:8080/index.htmin browser - Test basic functionality: color picker, effects, settings pages
- Start local server:
- Check for JavaScript errors in browser console
Code Validation
- No automated linting configured - follow existing code style in files you edit
- Code style: Use tabs for web files (.html/.css/.js), spaces (2 per level) for C++ files
- C++ formatting available:
clang-formatis installed but not in CI - Always run tests before finishing:
npm test
Manual Testing Scenarios
After making changes to web UI, always test:
- Load main interface: Verify index.htm loads without errors
- Navigation: Test switching between main page and settings pages
- Color controls: Verify color picker and brightness controls work
- Effects: Test effect selection and parameter changes
- Settings: Test form submission and validation
Common Tasks
Repository Structure
wled00/ # Main firmware source (C++)
├── data/ # Web interface files
│ ├── index.htm # Main UI
│ ├── settings*.htm # Settings pages
│ └── *.js/*.css # Frontend resources
├── *.cpp/*.h # Firmware source files
└── html_*.h # Generated embedded web files (DO NOT EDIT)
tools/ # Build tools (Node.js)
├── cdata.js # Web UI build script
└── cdata-test.js # Test suite
platformio.ini # Hardware build configuration
package.json # Node.js dependencies and scripts
.github/workflows/ # CI/CD pipelines
Key Files and Their Purpose
wled00/data/index.htm- Main web interfacewled00/data/settings*.htm- Configuration pagestools/cdata.js- Converts web files to C++ headerswled00/wled.h- Main firmware configurationplatformio.ini- Hardware build targets and settings
Development Workflow
-
For web UI changes:
- Edit files in
wled00/data/ - Run
npm run buildto regenerate headers - Test with local HTTP server
- Run
npm testto validate build system
- Edit files in
-
For firmware changes:
- Edit files in
wled00/(but NOThtml_*.hfiles) - Ensure web UI is built first (
npm run build) - Build firmware:
pio run -e [target] - Flash to device:
pio run -e [target] --target upload
- Edit files in
-
For both web and firmware:
- Always build web UI first
- Test web interface manually
- Build and test firmware if making firmware changes
Build Timing and Timeouts
- Web UI build: 3 seconds - Set timeout to 30 seconds minimum
- Test suite: 40 seconds - Set timeout to 2 minutes minimum
- Hardware builds: 15+ minutes - Set timeout to 30+ minutes minimum
- NEVER CANCEL long-running builds - PlatformIO downloads and compilation can take significant time
Troubleshooting
Common Issues
- Build fails with missing html_*.h: Run
npm run buildfirst - Web UI looks broken: Check browser console for JavaScript errors
- PlatformIO network errors: Try again, downloads can be flaky
- Node.js version issues: Ensure Node.js 20+ is installed (check
.nvmrc)
When Things Go Wrong
- Clear generated files:
rm -f wled00/html_*.hthen rebuild - Force web UI rebuild:
npm run build -- --forceornpm run build -- -f - Clean PlatformIO cache:
pio run --target clean - Reinstall dependencies:
rm -rf node_modules && npm install
Important Notes
- DO NOT edit
wled00/html_*.hfiles - they are auto-generated - Always commit both source files AND generated html_*.h files
- Web UI must be built before firmware compilation
- Test web interface manually after any web UI changes
- Use VS Code with PlatformIO extension for best development experience
- Hardware builds require appropriate ESP32/ESP8266 development board
CI/CD Pipeline
The GitHub Actions workflow:
- Installs Node.js and Python dependencies
- Runs
npm testto validate build system - Builds web UI with
npm run build - Compiles firmware for multiple hardware targets
- Uploads build artifacts
Match this workflow in your local development to ensure CI success.