Add complete REST API for lighting control
- Migrated from websockets to aiohttp for unified HTTP/WebSocket server - Added REST endpoints: /api/pattern, /api/parameters, /api/state, /api/tempo/reset - Implemented color palette API with 8-slot system and selected colors - First selected color (index 0) is used as primary RGB for patterns - All operations now available via simple HTTP requests (no WebSocket needed) - Added comprehensive documentation: FRONTEND_API.md, COLOR_PALETTE_API.md - Added test scripts: test_rest_api.sh, test_color_patterns.py - Updated test/test_control_server.py for new /ws WebSocket path - Configuration persistence via lighting_config.json - Pattern parameters (n1-n4, brightness, delay) controllable via API - WebSocket still available at /ws for legacy support
This commit is contained in:
246
REST_API_COMPLETE.md
Normal file
246
REST_API_COMPLETE.md
Normal file
@@ -0,0 +1,246 @@
|
||||
# REST API Implementation - Complete ✅
|
||||
|
||||
## Summary
|
||||
|
||||
The lighting controller now has a **complete REST API** - no WebSocket required for frontend operations!
|
||||
|
||||
All lighting control functions are available via simple HTTP requests.
|
||||
|
||||
---
|
||||
|
||||
## What Was Added
|
||||
|
||||
### New API Endpoints
|
||||
|
||||
1. **`GET /api/state`** - Get complete system state
|
||||
2. **`GET/POST /api/pattern`** - Get/change active pattern
|
||||
3. **`GET/POST /api/parameters`** - Get/change brightness, delay, n1-n4
|
||||
4. **`POST /api/tempo/reset`** - Reset tempo detection
|
||||
5. **`GET/POST /api/color-palette`** - Color palette (already existed)
|
||||
|
||||
### WebSocket Status
|
||||
|
||||
- WebSocket endpoint still available at `/ws` for legacy support
|
||||
- **New frontends should use REST API only**
|
||||
- Simpler, more standard, easier to debug
|
||||
|
||||
---
|
||||
|
||||
## Test Results
|
||||
|
||||
All endpoints tested and working:
|
||||
|
||||
```bash
|
||||
✅ GET /api/state - Returns complete system state
|
||||
✅ POST /api/pattern - Changes pattern successfully
|
||||
✅ GET /api/pattern - Returns current pattern
|
||||
✅ POST /api/parameters - Updates brightness/delay/n1-n4
|
||||
✅ GET /api/parameters - Returns all parameters
|
||||
✅ POST /api/color-palette - Updates palette/selection
|
||||
✅ GET /api/color-palette - Returns palette state
|
||||
```
|
||||
|
||||
**Sample Test Output:**
|
||||
```json
|
||||
// POST /api/pattern
|
||||
{
|
||||
"status": "ok",
|
||||
"pattern": "rainbow"
|
||||
}
|
||||
|
||||
// GET /api/parameters
|
||||
{
|
||||
"brightness": 75,
|
||||
"delay": 100,
|
||||
"n1": 10,
|
||||
"n2": 10,
|
||||
"n3": 1,
|
||||
"n4": 1
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Documentation
|
||||
|
||||
**Main Documentation:** `FRONTEND_API.md`
|
||||
|
||||
Contains:
|
||||
- Complete API reference
|
||||
- JavaScript examples
|
||||
- React component examples
|
||||
- Vanilla JS examples
|
||||
- Error handling
|
||||
- Full working code samples
|
||||
|
||||
**Quick Reference:** `COLOR_API_QUICK_REF.md`
|
||||
|
||||
---
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Load Initial State
|
||||
```javascript
|
||||
const response = await fetch('http://10.42.0.1:8765/api/state');
|
||||
const state = await response.json();
|
||||
// state contains: pattern, parameters, color_palette, beat_index
|
||||
```
|
||||
|
||||
### Change Pattern
|
||||
```javascript
|
||||
await fetch('http://10.42.0.1:8765/api/pattern', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({pattern: 'rainbow'})
|
||||
});
|
||||
```
|
||||
|
||||
### Adjust Brightness
|
||||
```javascript
|
||||
await fetch('http://10.42.0.1:8765/api/parameters', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({brightness: 75})
|
||||
});
|
||||
```
|
||||
|
||||
### Select Color
|
||||
```javascript
|
||||
await fetch('http://10.42.0.1:8765/api/color-palette', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({selected_indices: [2, 1]})
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Benefits Over WebSocket
|
||||
|
||||
1. **Simpler** - No connection management
|
||||
2. **Standard** - Works with any HTTP library
|
||||
3. **Debuggable** - Use curl, browser, Postman
|
||||
4. **Stateless** - No connection drops
|
||||
5. **Cacheable** - GET requests can be cached
|
||||
6. **RESTful** - Standard patterns
|
||||
|
||||
---
|
||||
|
||||
## Files Modified
|
||||
|
||||
### Backend
|
||||
- `src/control_server.py` - Added all REST endpoints
|
||||
|
||||
### Documentation
|
||||
- `FRONTEND_API.md` - Complete API documentation (new)
|
||||
- `REST_API_COMPLETE.md` - This file (new)
|
||||
|
||||
### Testing
|
||||
- `test_rest_api.sh` - Automated test script (new)
|
||||
|
||||
---
|
||||
|
||||
## Test Script
|
||||
|
||||
Run comprehensive tests:
|
||||
```bash
|
||||
./test_rest_api.sh localhost
|
||||
./test_rest_api.sh 10.42.0.1 # Remote testing
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## API Endpoint Summary
|
||||
|
||||
| Method | Endpoint | Purpose |
|
||||
|--------|----------|---------|
|
||||
| GET | `/api/state` | Get complete system state |
|
||||
| GET | `/api/pattern` | Get current pattern |
|
||||
| POST | `/api/pattern` | Change pattern |
|
||||
| GET | `/api/parameters` | Get all parameters |
|
||||
| POST | `/api/parameters` | Update parameters |
|
||||
| GET | `/api/color-palette` | Get color palette |
|
||||
| POST | `/api/color-palette` | Update palette/selection |
|
||||
| POST | `/api/tempo/reset` | Reset tempo detection |
|
||||
|
||||
---
|
||||
|
||||
## Available Patterns
|
||||
|
||||
Use these pattern names in POST requests:
|
||||
|
||||
- `"on"` / `"o"` - Solid color
|
||||
- `"off"` - All LEDs off
|
||||
- `"alternating"` / `"a"` - Alternating on/off
|
||||
- `"rainbow"` / `"r"` - Rainbow cycle
|
||||
- `"pulse"` / `"p"` - Pulsing effect
|
||||
- `"segmented_movement"` / `"sm"` - Moving segments
|
||||
- `"flicker"` / `"f"` - Flickering
|
||||
- `"n_chase"` / `"nc"` - Chase effect
|
||||
- `"radiate"` / `"rd"` - Radiate from center
|
||||
- `"specto"` / `"s"` - Spectograph
|
||||
|
||||
---
|
||||
|
||||
## Status
|
||||
|
||||
🟢 **PRODUCTION READY**
|
||||
|
||||
The REST API is fully implemented, tested, and documented. Frontend developers can now build UIs using only HTTP requests - no WebSocket needed.
|
||||
|
||||
---
|
||||
|
||||
## Next Steps for Frontend
|
||||
|
||||
1. Read `FRONTEND_API.md` for complete documentation
|
||||
2. Use `/api/state` to load initial UI state
|
||||
3. Use POST endpoints to control lights
|
||||
4. Implement UI with any framework (React, Vue, vanilla JS)
|
||||
5. No WebSocket connection needed!
|
||||
|
||||
---
|
||||
|
||||
## Quick Start for Frontend
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head><title>Lighting Control</title></head>
|
||||
<body>
|
||||
<button onclick="setPattern('rainbow')">Rainbow</button>
|
||||
<button onclick="setPattern('alternating')">Alternating</button>
|
||||
<input type="range" min="0" max="100" onchange="setBrightness(this.value)">
|
||||
|
||||
<script>
|
||||
const API = 'http://10.42.0.1:8765';
|
||||
|
||||
async function setPattern(pattern) {
|
||||
await fetch(`${API}/api/pattern`, {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({pattern})
|
||||
});
|
||||
}
|
||||
|
||||
async function setBrightness(value) {
|
||||
await fetch(`${API}/api/parameters`, {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({brightness: parseInt(value)})
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
That's it! No WebSocket, no complex setup.
|
||||
|
||||
---
|
||||
|
||||
## Support
|
||||
|
||||
- Full documentation: `FRONTEND_API.md`
|
||||
- Test script: `./test_rest_api.sh`
|
||||
- Color palette details: `COLOR_PALETTE_API.md`
|
||||
|
Reference in New Issue
Block a user