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

6.5 KiB

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:

{
  "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

{
  "$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

{
  "display_duration": "30"  // Wrong: string
}

Fix: Use correct types

{
  "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

{
  "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

{
  "football-scoreboard": {
    "nfl": "enabled"  // Wrong: should be object
  }
}

Fix: Use correct structure

{
  "football-scoreboard": {
    "nfl": {
      "enabled": true
    }
  }
}

4. Invalid JSON Syntax

Problem: Malformed JSON

{
  "plugin": {
    "enabled": true,  // Trailing comma
  }
}

Fix: Remove trailing commas, ensure valid JSON

{
  "plugin": {
    "enabled": true
  }
}

Tip: Validate JSON at https://jsonlint.com/

Debugging Configuration Loading

Enable Debug Logging

Set environment variable:

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:

{
  "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).

# 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 for the full list.

Backup and Recovery

Manual Backup

cp config/config.json config/config.backup.json

Automatic Backups

LEDMatrix creates backups before saves:

  • Location: config/backups/
  • Format: config_YYYYMMDD_HHMMSS.json

Recovery

# 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