mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-04-10 13:02:59 +00:00
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>
5.8 KiB
5.8 KiB
Developer Quick Reference
One-page quick reference for common LEDMatrix development tasks.
REST API Endpoints
Most Common Endpoints
# Get installed plugins
GET /api/v3/plugins/installed
# Get plugin configuration
GET /api/v3/plugins/config?plugin_id=<plugin_id>
# Save plugin configuration
POST /api/v3/plugins/config
{"plugin_id": "my-plugin", "config": {...}}
# Start on-demand display
POST /api/v3/display/on-demand/start
{"plugin_id": "my-plugin", "duration": 30}
# Get system status
GET /api/v3/system/status
# Execute system action
POST /api/v3/system/action
{"action": "start_display"}
Base URL: http://your-pi-ip:5000/api/v3
See API_REFERENCE.md for complete documentation.
Display Manager Quick Methods
# Core operations
display_manager.clear() # Clear display
display_manager.update_display() # Update physical display
# Text rendering
display_manager.draw_text("Hello", x=10, y=16, color=(255, 255, 255))
display_manager.draw_text("Centered", centered=True) # Auto-center
# Utilities
width = display_manager.get_text_width("Text", font)
height = display_manager.get_font_height(font)
# Weather icons
display_manager.draw_weather_icon("rain", x=10, y=10, size=16)
# Scrolling state
display_manager.set_scrolling_state(True)
display_manager.defer_update(lambda: self.update_cache(), priority=0)
Cache Manager Quick Methods
# Basic caching
cached = cache_manager.get("key", max_age=3600)
cache_manager.set("key", data)
cache_manager.clear_cache("key") # there is no delete() method
# Advanced caching
data = cache_manager.get_cached_data_with_strategy("key", data_type="weather")
data = cache_manager.get_background_cached_data("key", sport_key="nhl")
# Strategy
strategy = cache_manager.get_cache_strategy("weather")
interval = cache_manager.get_sport_live_interval("nhl")
Plugin Manager Quick Methods
# Get plugins
plugin = plugin_manager.get_plugin("plugin-id")
all_plugins = plugin_manager.get_all_plugins()
enabled = plugin_manager.get_enabled_plugins()
# Get info
info = plugin_manager.get_plugin_info("plugin-id")
modes = plugin_manager.get_plugin_display_modes("plugin-id")
BasePlugin Quick Reference
class MyPlugin(BasePlugin):
def update(self):
# Fetch data (called based on update_interval)
cache_key = f"{self.plugin_id}_data"
cached = self.cache_manager.get(cache_key, max_age=3600)
if cached:
self.data = cached
return
self.data = self._fetch_from_api()
self.cache_manager.set(cache_key, self.data)
def display(self, force_clear=False):
# Render display
if force_clear:
self.display_manager.clear()
self.display_manager.draw_text("Hello", x=10, y=16)
self.display_manager.update_display()
# Optional methods
def has_live_content(self) -> bool:
return len(self.live_items) > 0
def validate_config(self) -> bool:
return "api_key" in self.config
Common Patterns
Caching Pattern
def update(self):
cache_key = f"{self.plugin_id}_data"
cached = self.cache_manager.get(cache_key, max_age=3600)
if cached:
self.data = cached
return
self.data = self._fetch_from_api()
self.cache_manager.set(cache_key, self.data)
Error Handling Pattern
def display(self, force_clear=False):
try:
if not self.data:
self._display_no_data()
return
self._render_content()
self.display_manager.update_display()
except Exception as e:
self.logger.error(f"Display error: {e}", exc_info=True)
self._display_error()
Scrolling Pattern
def display(self, force_clear=False):
self.display_manager.set_scrolling_state(True)
try:
# Scroll content...
for x in range(width, -text_width, -2):
self.display_manager.clear()
self.display_manager.draw_text(text, x=x, y=16)
self.display_manager.update_display()
time.sleep(0.05)
finally:
self.display_manager.set_scrolling_state(False)
Plugin Development Checklist
- Plugin inherits from
BasePlugin - Implements
update()anddisplay()methods manifest.jsonwith required fieldsconfig_schema.jsonfor web UI (recommended)README.mdwith documentation- Error handling implemented
- Uses caching appropriately
- Tested on Raspberry Pi hardware
- Follows versioning best practices
Common Errors & Solutions
| Error | Solution |
|---|---|
| Plugin not discovered | Check manifest.json exists and id matches directory name |
| Import errors | Check requirements.txt and dependencies |
| Config validation fails | Verify config_schema.json syntax |
| Display not updating | Call update_display() after drawing |
| Cache not working | Check cache directory permissions |
File Locations
LEDMatrix/
├── plugins/ # Installed plugins
├── config/
│ ├── config.json # Main configuration
│ └── config_secrets.json # API keys and secrets
├── docs/ # Documentation
│ ├── API_REFERENCE.md
│ ├── PLUGIN_API_REFERENCE.md
│ └── ...
└── src/
├── display_manager.py
├── cache_manager.py
└── plugin_system/
└── base_plugin.py
Quick Links
- Complete API Reference
- Plugin API Reference
- Plugin Development Guide
- Advanced Patterns
- Configuration Guide
Tip: Bookmark this page for quick access to common methods and patterns!