Files
LEDMatrix/docs/CONFIG_DEBUGGING.md
Chuck 2f3433cebc docs: fix misc remaining docs (architecture, dev quickref, sub-dir READMEs)
PLUGIN_ARCHITECTURE_SPEC.md
- Added a banner at the top noting this is a historical design doc
  written before the plugin system shipped. The doc is ~1900 lines
  with 13 stale /api/plugins/* paths (real is /api/v3/plugins/*),
  references to web_interface_v2.py (current is app.py), and a
  Migration Strategy / Implementation Roadmap that's now history.
  Banner points readers at the current docs
  (PLUGIN_DEVELOPMENT_GUIDE, PLUGIN_API_REFERENCE,
  REST_API_REFERENCE) without needing to retrofit every section.

PLUGIN_CONFIG_ARCHITECTURE.md
- 10 occurrences of /api/plugins/* missing /v3 prefix. Bulk fixed.

DEVELOPER_QUICK_REFERENCE.md
- cache_manager.delete("key") -> cache_manager.clear_cache("key")
  with comment noting delete() doesn't exist. Same bug already
  documented in PLUGIN_API_REFERENCE.md.

SSH_UNAVAILABLE_AFTER_INSTALL.md
- 4 occurrences of port 5001 -> 5000 in AP-mode and Ethernet/WiFi
  recovery instructions.

PLUGIN_CUSTOM_ICONS_FEATURE.md
- Port 5001 -> 5000.

CONFIG_DEBUGGING.md
- Documented /api/v3/config/plugin/<id> and /api/v3/config/validate
  endpoints don't exist. Replaced with the real endpoints:
  /api/v3/config/main, /api/v3/plugins/schema?plugin_id=,
  /api/v3/plugins/config?plugin_id=. Added a note that validation
  runs server-side automatically on POST.

STARLARK_APPS_GUIDE.md
- "Plugins -> Starlark Apps" UI navigation path doesn't exist (5
  occurrences). Replaced with the real path: Plugin Manager tab,
  then the per-plugin Starlark Apps tab in the second nav row.
- "Navigate to Plugins" install step -> Plugin Manager tab.

web_interface/README.md
- Documented several endpoints that don't exist in the api_v3
  blueprint:
  - GET /api/v3/plugins (list) -> /api/v3/plugins/installed
  - GET /api/v3/plugins/<id> -> doesn't exist
  - POST /api/v3/plugins/<id>/config -> POST /api/v3/plugins/config
  - GET /api/v3/plugins/<id>/enable + /disable -> POST /api/v3/plugins/toggle
  - GET /api/v3/store/plugins -> /api/v3/plugins/store/list
  - POST /api/v3/store/install/<id> -> POST /api/v3/plugins/install
  - POST /api/v3/store/uninstall/<id> -> POST /api/v3/plugins/uninstall
  - POST /api/v3/store/update/<id> -> POST /api/v3/plugins/update
  - POST /api/v3/display/start/stop/restart -> POST /api/v3/system/action
  - GET /api/v3/display/status -> GET /api/v3/system/status
- Also fixed config/secrets.json -> config/config_secrets.json
- Replaced the per-section endpoint duplication with a current real
  endpoint list and a pointer to docs/REST_API_REFERENCE.md.
- Documented that SSE stream endpoints are defined directly on the
  Flask app at app.py:607-615, not in the api_v3 blueprint.

scripts/install/README.md
- Was missing 3 of the 9 install scripts in the directory:
  one-shot-install.sh, configure_wifi_permissions.sh, and
  debug_install.sh. Added them with brief descriptions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 09:19:47 -04:00

317 lines
6.5 KiB
Markdown

# Configuration Debugging Guide
This guide helps troubleshoot configuration issues in LEDMatrix.
## Configuration Files
### Main Files
| File | Purpose |
|------|---------|
| `config/config.json` | Main configuration |
| `config/config_secrets.json` | API keys and sensitive data |
| `config/config.template.json` | Template for new installations |
### Plugin Configuration
Each plugin's configuration is a top-level key in `config.json`:
```json
{
"football-scoreboard": {
"enabled": true,
"display_duration": 30,
"nfl": {
"enabled": true,
"live_priority": false
}
},
"odds-ticker": {
"enabled": true,
"display_duration": 15
}
}
```
## Schema Validation
Plugins define their configuration schema in `config_schema.json`. This enables:
- Automatic default value population
- Configuration validation
- Web UI form generation
### Missing Schema Warning
If a plugin doesn't have `config_schema.json`, you'll see:
```
WARNING - Plugin 'my-plugin' has no config_schema.json - configuration will not be validated.
```
**Fix**: Add a `config_schema.json` to your plugin directory.
### Schema Example
```json
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"default": true,
"description": "Enable or disable this plugin"
},
"display_duration": {
"type": "number",
"default": 15,
"minimum": 1,
"description": "How long to display in seconds"
},
"api_key": {
"type": "string",
"description": "API key for data access"
}
},
"required": ["api_key"]
}
```
## Common Configuration Issues
### 1. Type Mismatches
**Problem**: String value where number expected
```json
{
"display_duration": "30" // Wrong: string
}
```
**Fix**: Use correct types
```json
{
"display_duration": 30 // Correct: number
}
```
**Logged Warning**:
```
WARNING - Config display_duration has invalid string value '30', using default 15.0
```
### 2. Missing Required Fields
**Problem**: Required field not in config
```json
{
"football-scoreboard": {
"enabled": true
// Missing api_key which is required
}
}
```
**Logged Error**:
```
ERROR - Plugin football-scoreboard configuration validation failed: 'api_key' is a required property
```
### 3. Invalid Nested Objects
**Problem**: Wrong structure for nested config
```json
{
"football-scoreboard": {
"nfl": "enabled" // Wrong: should be object
}
}
```
**Fix**: Use correct structure
```json
{
"football-scoreboard": {
"nfl": {
"enabled": true
}
}
}
```
### 4. Invalid JSON Syntax
**Problem**: Malformed JSON
```json
{
"plugin": {
"enabled": true, // Trailing comma
}
}
```
**Fix**: Remove trailing commas, ensure valid JSON
```json
{
"plugin": {
"enabled": true
}
}
```
**Tip**: Validate JSON at https://jsonlint.com/
## Debugging Configuration Loading
### Enable Debug Logging
Set environment variable:
```bash
export LEDMATRIX_DEBUG=1
python run.py
```
### Check Merged Configuration
The configuration is merged with schema defaults. To see the final merged config:
1. Enable debug logging
2. Look for log entries like:
```
DEBUG - Merged config with schema defaults for football-scoreboard
```
### Configuration Load Order
1. Load `config.json`
2. Load `config_secrets.json`
3. Merge secrets into main config
4. For each plugin:
- Load plugin's `config_schema.json`
- Extract default values from schema
- Merge user config with defaults
- Validate merged config against schema
## Web Interface Issues
### Changes Not Saving
1. Check file permissions on `config/` directory
2. Check disk space
3. Look for errors in browser console
4. Check server logs for save errors
### Form Fields Not Appearing
1. Plugin may not have `config_schema.json`
2. Schema may have syntax errors
3. Check browser console for JavaScript errors
### Checkboxes Not Working
Boolean values from checkboxes should be actual booleans, not strings:
```json
{
"enabled": true, // Correct
"enabled": "true" // Wrong
}
```
## Config Key Collision Detection
LEDMatrix detects potential config key conflicts:
### Reserved Keys
These plugin IDs will trigger a warning:
- `display`, `schedule`, `timezone`, `plugin_system`
- `display_modes`, `system`, `hardware`, `debug`
- `log_level`, `emulator`, `web_interface`
**Warning**:
```
WARNING - Plugin ID 'display' conflicts with reserved config key.
```
### Case Collisions
Plugin IDs that differ only in case:
```
WARNING - Plugin ID 'Football-Scoreboard' may conflict with 'football-scoreboard' on case-insensitive file systems.
```
## Checking Configuration via API
The API blueprint mounts at `/api/v3` (`web_interface/app.py:144`).
```bash
# Get full main config (includes all plugin sections)
curl http://localhost:5000/api/v3/config/main
# Save updated main config
curl -X POST http://localhost:5000/api/v3/config/main \
-H "Content-Type: application/json" \
-d @new-config.json
# Get config schema for a specific plugin
curl "http://localhost:5000/api/v3/plugins/schema?plugin_id=football-scoreboard"
# Get a single plugin's current config
curl "http://localhost:5000/api/v3/plugins/config?plugin_id=football-scoreboard"
```
> There is no dedicated `/config/plugin/<id>` or `/config/validate`
> endpoint — config validation runs server-side automatically when you
> POST to `/config/main` or `/plugins/config`. See
> [REST_API_REFERENCE.md](REST_API_REFERENCE.md) for the full list.
## Backup and Recovery
### Manual Backup
```bash
cp config/config.json config/config.backup.json
```
### Automatic Backups
LEDMatrix creates backups before saves:
- Location: `config/backups/`
- Format: `config_YYYYMMDD_HHMMSS.json`
### Recovery
```bash
# List backups
ls -la config/backups/
# Restore from backup
cp config/backups/config_20240115_120000.json config/config.json
```
## Troubleshooting Checklist
- [ ] JSON syntax is valid (no trailing commas, quotes correct)
- [ ] Data types match schema (numbers are numbers, not strings)
- [ ] Required fields are present
- [ ] Nested objects have correct structure
- [ ] File permissions allow read/write
- [ ] No reserved config key collisions
- [ ] Plugin has `config_schema.json` for validation
## Getting Help
1. Check logs: `tail -f logs/ledmatrix.log`
2. Enable debug: `LEDMATRIX_DEBUG=1`
3. Check error dashboard: `/api/v3/errors/summary`
4. Validate JSON: https://jsonlint.com/
5. File an issue: https://github.com/ChuckBuilds/LEDMatrix/issues