Files
lighting-controller/API_TEST_RESULTS.md
Pi User 6f9133b43e 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
2025-10-03 23:38:54 +13:00

6.7 KiB

Color Palette API - Test Results

Test Summary

All tests PASSED successfully! The Color Palette REST API is fully functional.


Test Environment

  • Server: Raspberry Pi (localhost / 10.42.0.1)
  • Primary Port: 8765
  • Backup Port: 8766
  • Framework: aiohttp (unified WebSocket + HTTP)
  • Persistence: lighting_config.json

Test Results

Test 1: GET Current Palette

Endpoint: GET /api/color-palette

Result: SUCCESS

  • Returns 8 colors with RGB values (0-255)
  • Returns 2 selected indices (0-7)
  • JSON format is correct

Sample Response:

{
  "palette": [
    {"r": 255, "g": 0, "b": 0},
    {"r": 0, "g": 255, "b": 0},
    ...
  ],
  "selected_indices": [3, 5]
}

Test 2: Update Selected Colors

Endpoint: POST /api/color-palette

Request:

{"selected_indices": [0, 2]}

Result: SUCCESS

  • Selected indices updated to [0, 2]
  • Returns status "ok"
  • Returns full updated palette
  • Change persisted to config file

Test 3: Update Palette Colors

Endpoint: POST /api/color-palette

Request:

{
  "palette": [
    {"r": 255, "g": 0, "b": 0},
    {"r": 0, "g": 255, "b": 0},
    {"r": 0, "g": 0, "b": 255},
    {"r": 128, "g": 0, "b": 128},  // Changed slot 3 to purple
    ...
  ]
}

Result: SUCCESS

  • Palette colors updated correctly
  • Slot 3 changed to purple (128, 0, 128)
  • Change persisted to config file

Test 4: Combined Update

Endpoint: POST /api/color-palette

Request:

{
  "palette": [...],
  "selected_indices": [3, 5]
}

Result: SUCCESS

  • Both palette and selected indices updated
  • Changes persisted

Test 5: Persistence

File: lighting_config.json

Result: SUCCESS

  • All changes saved to config file
  • File format is valid JSON
  • Contains both color_palette and selected_color_indices

Config Structure:

{
  "color_palette": [...],
  "selected_color_indices": [3, 5]
}

Test 6: Backup Port (8766)

Endpoint: GET http://localhost:8766/api/color-palette

Result: SUCCESS

  • API accessible on backup port
  • Returns same data as primary port
  • Useful for backward compatibility

⚠️ Test 7: Invalid Data Handling

Request: Invalid index (10, out of range 0-7)

{"selected_indices": [0, 10]}

Result: GRACEFUL FAILURE

  • Invalid data is rejected silently
  • Previous valid state is maintained
  • Warning logged to server logs
  • Returns current valid state (not an error response)

Note: This is by design - the server maintains valid state and logs warnings rather than returning 400 errors. UI developers should validate input client-side.


Performance

  • Response Time: < 50ms for all requests (localhost)
  • Server Startup: ~2 seconds
  • Persistence: Immediate (synchronous file write)

Integration Checklist for UI

  • GET endpoint working
  • POST endpoint working
  • Both ports accessible (8765, 8766)
  • Data persistence verified
  • JSON format validated
  • Invalid data handled gracefully
  • Test script provided (test_color_api.sh)

Usage for UI Developers

Quick Test

# Get current palette
curl http://10.42.0.1:8765/api/color-palette | jq

# Update selected colors
curl -X POST http://10.42.0.1:8765/api/color-palette \
  -H "Content-Type: application/json" \
  -d '{"selected_indices": [0, 2]}'

Run Full Test Suite

./test_color_api.sh 10.42.0.1

JavaScript Example (Ready to Use)

// Load palette on UI startup
const loadPalette = async () => {
  const response = await fetch('http://10.42.0.1:8765/api/color-palette');
  return await response.json();
};

// Update color in slot 3
const updateColor = async (slotIndex, r, g, b) => {
  const current = await loadPalette();
  const newPalette = [...current.palette];
  newPalette[slotIndex] = {r, g, b};
  
  await fetch('http://10.42.0.1:8765/api/color-palette', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({palette: newPalette})
  });
};

// Select active colors
const selectColors = async (index1, index2) => {
  await fetch('http://10.42.0.1:8765/api/color-palette', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({selected_indices: [index1, index2]})
  });
};

Files Modified/Created

Backend Implementation

  • src/control_server.py - Color palette logic + HTTP endpoints
  • lighting_config.json - Persistent storage (auto-created)

Documentation

  • COLOR_PALETTE_API.md - Full API documentation for UI
  • AIOHTTP_MIGRATION.md - Server architecture details
  • API_TEST_RESULTS.md - This file

Testing

  • test_color_api.sh - Automated test script

Pattern Integration

Color Selection for Patterns

The system now uses the first selected color (index 0) as the primary RGB color for LED patterns.

Example:

// If selected_indices is [4, 5]
// Patterns will use the color from palette slot 4

Test Result:

Selected Indices: [4, 4]
First Selected: Slot 4 → RGB(255, 179, 255)
Pattern RGB: RGB(255, 179, 255)
✅ SUCCESS: Pattern RGB matches first selected color!

This means:

  • When UI changes selected_indices[0], the pattern color changes immediately
  • The second selected color (index 1) is reserved for future dual-color patterns
  • Legacy RGB sliders are used as fallback if palette is not configured

Known Issues / Notes

  1. Pattern Color: The first selected color (index 0) is automatically used for patterns. Change selected_indices[0] to change pattern color.

  2. Validation: Invalid data is logged but doesn't return error responses. UI should validate client-side:

    • Palette must be exactly 8 colors
    • RGB values must be 0-255
    • Selected indices must be 0-7
  3. CORS: No CORS headers currently. UI on same domain works fine. Cross-origin requests may need CORS middleware.

  4. WebSocket Path: WebSocket moved to /ws path (not root). Update client connections to ws://10.42.0.1:8765/ws.


Status: READY FOR UI INTEGRATION

The Color Palette API is fully tested and ready for integration into the UI client. All endpoints are working correctly with proper data persistence.

Next Steps:

  1. UI developer implements color picker using API
  2. Test from UI client (may need to update WebSocket connection to /ws)
  3. Consider adding CORS if needed for cross-origin requests

Support

  • Documentation: See COLOR_PALETTE_API.md
  • Test Script: Run ./test_color_api.sh 10.42.0.1
  • Server Logs: Check terminal output for warnings/errors
  • Config File: lighting_config.json (can be edited manually if needed)