Files
led-controller/docs/API.md
Jimmy 9e2409430c Add documentation and utility modules
- Add API specification documentation
- Add system specification document
- Add UI mockups and documentation
- Add utility modules (wifi)
2026-01-11 21:34:18 +13:00

6.9 KiB

LED Controller API Specification

Base URL: http://device-ip/ or http://192.168.4.1/ (when in AP mode)
Protocol: HTTP/1.1
Content-Type: application/json

Presets API

GET /presets

List all presets.

Response: 200 OK

{
  "preset1": {
    "name": "preset1",
    "pattern": "on",
    "colors": [[255, 0, 0]],
    "delay": 100,
    "n1": 0,
    "n2": 0,
    "n3": 0,
    "n4": 0,
    "n5": 0,
    "n6": 0,
    "n7": 0,
    "n8": 0
  }
}

GET /presets/{name}

Get a specific preset by name.

Response: 200 OK

{
  "name": "preset1",
  "pattern": "on",
  "colors": [[255, 0, 0]],
  "delay": 100,
  "n1": 0,
  "n2": 0,
  "n3": 0,
  "n4": 0,
  "n5": 0,
  "n6": 0,
  "n7": 0,
  "n8": 0
}

Response: 404 Not Found

{
  "error": "Preset not found"
}

POST /presets

Create a new preset.

Request Body:

{
  "name": "preset1",
  "pattern": "on",
  "colors": [[255, 0, 0]],
  "delay": 100,
  "n1": 0,
  "n2": 0,
  "n3": 0,
  "n4": 0,
  "n5": 0,
  "n6": 0,
  "n7": 0,
  "n8": 0
}

Response: 201 Created - Returns the created preset

Response: 400 Bad Request

{
  "error": "Name is required"
}

Response: 409 Conflict

{
  "error": "Preset already exists"
}

PUT /presets/{name}

Update an existing preset.

Request Body:

{
  "delay": 200,
  "colors": [[0, 255, 0]]
}

Response: 200 OK - Returns the updated preset

Response: 404 Not Found

{
  "error": "Preset not found"
}

DELETE /presets/{name}

Delete a preset.

Response: 200 OK

{
  "message": "Preset deleted successfully"
}

Response: 404 Not Found

{
  "error": "Preset not found"
}

Profiles API

GET /profiles

List all profiles.

Response: 200 OK

{
  "profile1": {
    "name": "profile1",
    "description": "Profile description",
    "scenes": []
  }
}

GET /profiles/{name}

Get a specific profile by name.

Response: 200 OK

{
  "name": "profile1",
  "description": "Profile description",
  "scenes": []
}

Response: 404 Not Found

{
  "error": "Profile not found"
}

POST /profiles

Create a new profile.

Request Body:

{
  "name": "profile1",
  "description": "Profile description",
  "scenes": []
}

Response: 201 Created - Returns the created profile

Response: 400 Bad Request

{
  "error": "Name is required"
}

Response: 409 Conflict

{
  "error": "Profile already exists"
}

PUT /profiles/{name}

Update an existing profile.

Request Body:

{
  "description": "Updated description"
}

Response: 200 OK - Returns the updated profile

Response: 404 Not Found

{
  "error": "Profile not found"
}

DELETE /profiles/{name}

Delete a profile.

Response: 200 OK

{
  "message": "Profile deleted successfully"
}

Response: 404 Not Found

{
  "error": "Profile not found"
}

Scenes API

GET /scenes

List all scenes. Optionally filter by profile using query parameter.

Query Parameters:

  • profile (optional): Filter scenes by profile name

Example: GET /scenes?profile=profile1

Response: 200 OK

{
  "profile1:scene1": {
    "name": "scene1",
    "profile_name": "profile1",
    "description": "Scene description",
    "transition_time": 0,
    "devices": [
      {"device_name": "device1", "preset_name": "preset1"},
      {"device_name": "device2", "preset_name": "preset2"}
    ]
  }
}

GET /scenes/{profile_name}/{scene_name}

Get a specific scene.

Response: 200 OK

{
  "name": "scene1",
  "profile_name": "profile1",
  "description": "Scene description",
  "transition_time": 0,
  "devices": [
    {"device_name": "device1", "preset_name": "preset1"},
    {"device_name": "device2", "preset_name": "preset2"}
  ]
}

Response: 404 Not Found

{
  "error": "Scene not found"
}

POST /scenes

Create a new scene.

Request Body:

{
  "name": "scene1",
  "profile_name": "profile1",
  "description": "Scene description",
  "transition_time": 0,
  "devices": [
    {"device_name": "device1", "preset_name": "preset1"},
    {"device_name": "device2", "preset_name": "preset2"}
  ]
}

Response: 201 Created - Returns the created scene

Response: 400 Bad Request

{
  "error": "Name is required"
}

or

{
  "error": "Profile name is required"
}

Response: 409 Conflict

{
  "error": "Scene already exists"
}

PUT /scenes/{profile_name}/{scene_name}

Update an existing scene.

Request Body:

{
  "transition_time": 500,
  "description": "Updated description"
}

Response: 200 OK - Returns the updated scene

Response: 404 Not Found

{
  "error": "Scene not found"
}

DELETE /scenes/{profile_name}/{scene_name}

Delete a scene.

Response: 200 OK

{
  "message": "Scene deleted successfully"
}

Response: 404 Not Found

{
  "error": "Scene not found"
}

POST /scenes/{profile_name}/{scene_name}/devices

Add a device assignment to a scene.

Request Body:

{
  "device_name": "device1",
  "preset_name": "preset1"
}

Response: 200 OK - Returns the updated scene

Response: 400 Bad Request

{
  "error": "Device name and preset name are required"
}

Response: 404 Not Found

{
  "error": "Scene not found"
}

DELETE /scenes/{profile_name}/{scene_name}/devices/{device_name}

Remove a device assignment from a scene.

Response: 200 OK - Returns the updated scene

Response: 404 Not Found

{
  "error": "Scene not found"
}

Patterns API

GET /patterns

Get the list of available pattern names.

Response: 200 OK

["on", "bl", "cl", "rb", "sb", "o"]

POST /patterns

Add a new pattern name to the list.

Request Body:

{
  "name": "new_pattern"
}

Response: 201 Created - Returns the updated list of patterns

["on", "bl", "cl", "rb", "sb", "o", "new_pattern"]

Response: 400 Bad Request

{
  "error": "Name is required"
}

Response: 409 Conflict

{
  "error": "Pattern already exists"
}

DELETE /patterns/{name}

Remove a pattern name from the list.

Response: 200 OK

{
  "message": "Pattern deleted successfully"
}

Response: 404 Not Found

{
  "error": "Pattern not found"
}

Error Responses

All endpoints may return the following error responses:

400 Bad Request - Invalid request data

{
  "error": "Error message"
}

404 Not Found - Resource not found

{
  "error": "Resource not found"
}

409 Conflict - Resource already exists

{
  "error": "Resource already exists"
}

500 Internal Server Error - Server error

{
  "error": "Error message"
}