mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-10-04 06:15:09 +00:00
* chore(scripts): delete unreferenced helper scripts None of these is referenced by an installer, systemd unit, CI workflow, test, the web UI or src/: - utils/cleanup_venv.sh removes venv_web_v2, which nothing creates - utils/clear_python_cache.sh hardcodes ~/LEDMatrix and a .webassets-cache nothing uses - install/migrate_config.sh only copies the template, which the installer and ConfigManager already do - install/debug_install.sh, debug/debug_web_manual.py - diagnose_web_ui.sh and verify_web_ui.sh overlap diagnose_web_interface.sh, which the docs point to - fix_internet_connectivity.sh is iptables-only (stale on nftables) - diagnose_plugin_permissions.sh, dev/validate_python.py - download_nba_logos.py + README_NBA_LOGOS.md: logo_downloader fetches logos on demand - setup_plugin_repos.py linked into the production plugin-repos/ dir; the dev workflow is scripts/dev/dev_plugin_setup.sh, and MULTI_ROOT_WORKSPACE_SETUP.md now uses it Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(config): drop unused plugin_system flags and a dead unit comment - config.template.json: remove plugin_system.auto_discover, auto_load_enabled and development_mode. Nothing reads them; the web UI only stores them when a client sends them. ConfigManager's migration only adds template keys, so existing configs keep theirs unchanged. - config.template.json: re-indent vegas_scroll's live_* keys. - systemd/ledmatrix.service: remove the comment documenting LEDMATRIX_ON_DEMAND_PLUGIN / on_demand_env.conf; nothing reads either. - CONFIG_REFERENCE.md: say the legacy keys are no longer in the template. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs: delete docs/archive and PLUGIN_IMPLEMENTATION_SUMMARY.md - docs/archive/: superseded guides; the repository history keeps them and no live doc links into the directory. The one open document in it, WEB_UI_AUDIT_2026-09.md, moves to docs/audits/ and is linked from the docs index. - PLUGIN_IMPLEMENTATION_SUMMARY.md invented usage statistics, called v2.0.0 current, listed shipped auto-updates as future work and documented a BasePlugin.get_config() that does not exist. - docs/README.md: drop both, and stop telling contributors to archive obsolete pages instead of deleting them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(plugin-api): fix extra_small_font size, cache metric key and scroll pacing example - PLUGIN_API_REFERENCE: extra_small_font loads at 7, not 6 (crisp_size snaps it, src/display_manager.py); get_cache_metrics() returns cache_hit_rate, not hit_rate (src/cache/cache_metrics.py). - ADVANCED_PLUGIN_DEVELOPMENT: the basic scrolling example slept in a loop and never passed frame_hold; use ScrollHelper + scroll_config.configure() and set_scrolling_state(True, frame_hold=...) as PLUGIN_API_REFERENCE does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(plugin-config): match the config tab, icon and web-action docs to the code - PLUGIN_CONFIG_QUICK_START / PLUGIN_CONFIGURATION_TABS / PLUGIN_CONFIGURATION_GUIDE: there is no "Reset to Defaults" button (the tab has Refresh, Update, Uninstall, Save Configuration); plugin config hot-reloads (ConfigService + on_config_change), so no restart; the schema is found by the fixed name config_schema.json, not a manifest config_schema field; the tab row is "Plugin Manager", not "Plugins"; forms are server-rendered from /v3/partials/plugin-config/<id>; the duration hook is get_display_duration()/display_duration; a class_name mismatch raises PluginError; the store requires id, name, class_name and display_modes (not version); plugin_system.debug/log_level do not exist (use run.py -d / LEDMATRIX_DEBUG). Drop "future" features that shipped. - PLUGIN_CONFIG_CORE_PROPERTIES: list all of CORE_PLUGIN_PROPERTIES, including skin, skin_options and the vegas_* tuning keys. - PLUGIN_CUSTOM_ICONS: icon is only a Font Awesome class (fallback fa-puzzle-piece); emoji/URL icons and getPluginIcon() never existed in v3. Note that /api/v3/plugins/installed currently omits icon. - PLUGIN_WEB_UI_ACTIONS (+ example JSON): success_message, error_message and step1_message are never read. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(store): describe the monorepo registry and the store UI as they are - PLUGIN_STORE_GUIDE: the Plugin Store is a section of the Plugin Manager tab; URL installs are "Install from GitHub" -> "Install Single Plugin"; bulk update exists (Check & Update All) plus opt-in weekly auto-update; PluginStoreManager() defaults to plugins/, so the Python examples pass plugin-repos; registry plugins are downloaded (GitHub API, ZIP fallback), not cloned; updates compare version with latest_version. - PLUGIN_REGISTRY_SETUP_GUIDE: replace the per-plugin-repo + tag walkthrough with a short page on the monorepo registry (plugin_path, latest_version, update_registry.py) that points at the monorepo's own SUBMISSION.md. Drops the reference to the deleted PLUGIN_IMPLEMENTATION_SUMMARY.md and setup_plugin_repos.py. - plugin_registry_template.json: use the real entry shape. - PLUGIN_QUICK_REFERENCE: automatic background updates exist (opt-in); registry example and publishing steps use the monorepo, not tags. - PLUGIN_DEVELOPMENT_GUIDE: tags/releases are not read by the store. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(readme): fix the Triple Bonnet mapping, install prerequisites and backup names - README: the Adafruit Triple Bonnet uses `regular` (3 outputs), not `regular-pi1` (1 output) -- src/matrix_support.py MAPPING_OUTPUTS, and the README's own hardware_mapping section; the template default mapping is adafruit-hat, the PWM mod switches it to adafruit-hat-pwm; manual install only needs git up front (first_time_install.sh installs python-dev-is-python3, cmake, ninja-build etc.; cython3/scons are not used); the Pi Zero 2 W is a supported low-memory board, consistent with PRODUCT.md, LOW_MEMORY_BOARDS.md and the installer's low-memory build; fix the "First_time_install.sh" spelling, an orphan "2." list item and the hello-world starter link (it lives in the plugins monorepo). - CONFIG_DEBUGGING: automatic backups are config/backups/config.json.backup.<YYYYMMDD_HHMMSS_ffffff> (five kept), not config_YYYYMMDD_HHMMSS.json. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(dev): correct the test-running and rgbmatrix build instructions - HOW_TO_RUN_TESTS: coverage is not collected by a plain pytest run and pytest.ini has no threshold; the only one is --cov-fail-under=52 in the core unit-test job of .github/workflows/test.yml, which runs the whole test/ tree (not an allowlist). Almost no tests carry markers, so -m integration / -m slow select nothing; drop them and -m unit as the quick check. Replace the hardcoded /home/chuck path. - DEVELOPMENT: the rgbmatrix package is built with pip install . from the submodule root (scikit-build-core + CMake + Ninja), as first_time_install.sh does; there is no make build-python / bindings/python step, and the build deps are python-dev-is-python3, cmake and ninja-build, not cython3/scons. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(wifi): the setup AP is open; auto-enable can be turned off without code changes - WIFI_NETWORK_SETUP / SSH_UNAVAILABLE_AFTER_INSTALL: both AP paths in src/wifi_manager.py create an open network and nothing reads ap_password, so drop the "ledmatrix123" password and the ap_password key/advice. - SSH_UNAVAILABLE_AFTER_INSTALL: disabling automatic AP mode does not need code changes -- auto_enable_ap_mode is a WiFi-tab toggle and POST /api/v3/wifi/ap/auto-enable; note the monitor daemon reads wifi_config.json at start, so restart it after changing the setting. Use the ledpi username and a relative install path like the other docs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(reference): add auto_update, drop drifted line numbers, fix UI and service details - CONFIG_REFERENCE: document the top-level auto_update.enabled key (read by web_interface/auto_update.py and src/auto_update_setup.py); replace drifted file:line references with function names; the template's dim_schedule mode is "global". - ADVANCED_FEATURES: core does not read a per-plugin background_service block (the sports plugins read their own), and priority is "higher number = higher priority" on FetchRequest but not used for ordering. - WEB_INTERFACE_GUIDE: the General tab toggle is "Web Display Autostart" (web interface service), brightness is 1-100, and config paths are relative to the LEDMatrix folder, not /config. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs: drop references to code removed in #608 get_installed_plugin_info, WiFiManager's saved_networks and the six always-skipping plugin test files are deleted there. NetworkManager already remembers joined networks; LEDMatrix no longer stores WiFi passwords. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs: don't link SKIN_SYSTEM.md from the core-properties page #615 deletes SKIN_SYSTEM.md; with this link, whichever of the two merged second would break test_doc_links. The skin/skin_options entries go when #615 removes the keys. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
510 lines
14 KiB
Markdown
510 lines
14 KiB
Markdown
# Plugin Store Guide
|
|
|
|
## Overview
|
|
|
|
The LEDMatrix Plugin Store allows you to discover, install, and manage display plugins for your LED matrix. Install curated plugins from the official registry or add custom plugins directly from any GitHub repository.
|
|
|
|
In the web interface, the **Plugin Store** is a section of the **Plugin
|
|
Manager** tab (below the installed plugins), followed by an **Install from
|
|
GitHub** section.
|
|
|
|
The Python examples below pass `plugins_dir="plugin-repos"`:
|
|
`PluginStoreManager()` defaults to `plugins`, but the web interface and the
|
|
plugin loader use `plugin_system.plugins_directory` from `config.json`
|
|
(`plugin-repos` by default).
|
|
|
|
---
|
|
|
|
## Quick Reference
|
|
|
|
### Install from Store
|
|
```bash
|
|
# Web UI: Plugin Manager → Plugin Store section → Search → Click Install
|
|
# API:
|
|
curl -X POST http://your-pi-ip:5000/api/v3/plugins/install \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"plugin_id": "clock-simple"}'
|
|
```
|
|
|
|
### Install from GitHub URL
|
|
```bash
|
|
# Web UI: Plugin Manager → Install from GitHub → "Install Single Plugin" → Paste URL
|
|
# API:
|
|
curl -X POST http://your-pi-ip:5000/api/v3/plugins/install-from-url \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"repo_url": "https://github.com/user/ledmatrix-plugin"}'
|
|
```
|
|
|
|
### Manage Plugins
|
|
```bash
|
|
# List installed
|
|
curl "http://your-pi-ip:5000/api/v3/plugins/installed"
|
|
|
|
# Enable/disable
|
|
curl -X POST http://your-pi-ip:5000/api/v3/plugins/toggle \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"plugin_id": "clock-simple", "enabled": true}'
|
|
|
|
# Update
|
|
curl -X POST http://your-pi-ip:5000/api/v3/plugins/update \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"plugin_id": "clock-simple"}'
|
|
|
|
# Uninstall
|
|
curl -X POST http://your-pi-ip:5000/api/v3/plugins/uninstall \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"plugin_id": "clock-simple"}'
|
|
```
|
|
|
|
---
|
|
|
|
## Installation Methods
|
|
|
|
### Method 1: From Official Plugin Store (Recommended)
|
|
|
|
The official plugin store contains curated, verified plugins that have been reviewed by maintainers.
|
|
|
|
**Via Web Interface:**
|
|
1. Open the web interface at http://your-pi-ip:5000
|
|
2. Navigate to the "Plugin Manager" tab and scroll to the "Plugin Store" section
|
|
3. Browse or search for plugins
|
|
4. Click "Install" on the desired plugin
|
|
5. Wait for installation to complete
|
|
6. Restart the display to activate the plugin
|
|
|
|
**Via REST API:**
|
|
```bash
|
|
curl -X POST http://your-pi-ip:5000/api/v3/plugins/install \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"plugin_id": "clock-simple"}'
|
|
```
|
|
|
|
**Via Python:**
|
|
```python
|
|
from src.plugin_system.store_manager import PluginStoreManager
|
|
|
|
store = PluginStoreManager(plugins_dir="plugin-repos")
|
|
success = store.install_plugin('clock-simple')
|
|
if success:
|
|
print("Plugin installed!")
|
|
```
|
|
|
|
### Method 2: From Custom GitHub URL
|
|
|
|
Install any plugin directly from a GitHub repository, even if it's not in the official store. This method is useful for:
|
|
- Testing your own plugins during development
|
|
- Installing community plugins before they're in the official store
|
|
- Using private plugins
|
|
- Sharing plugins with specific users
|
|
|
|
**Via Web Interface:**
|
|
1. Open the web interface
|
|
2. Navigate to the "Plugin Manager" tab
|
|
3. Find "Install Single Plugin" in the "Install from GitHub" section
|
|
4. Paste the GitHub repository URL (e.g., `https://github.com/user/ledmatrix-my-plugin`)
|
|
and optionally a branch
|
|
5. Click "Install"
|
|
6. Review the warning about unverified plugins
|
|
7. Confirm installation
|
|
8. Wait for installation to complete
|
|
9. Restart the display
|
|
|
|
**Via REST API:**
|
|
```bash
|
|
curl -X POST http://your-pi-ip:5000/api/v3/plugins/install-from-url \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"repo_url": "https://github.com/user/ledmatrix-my-plugin"}'
|
|
```
|
|
|
|
**Via Python:**
|
|
```python
|
|
from src.plugin_system.store_manager import PluginStoreManager
|
|
|
|
store = PluginStoreManager(plugins_dir="plugin-repos")
|
|
result = store.install_from_url('https://github.com/user/ledmatrix-my-plugin')
|
|
|
|
if result['success']:
|
|
print(f"Installed: {result['plugin_id']}")
|
|
else:
|
|
print(f"Error: {result['error']}")
|
|
```
|
|
|
|
---
|
|
|
|
## Searching for Plugins
|
|
|
|
**Via Web Interface:**
|
|
- Use the search bar to search by name, description, or author
|
|
- Filter by category (sports, weather, time, finance, etc.)
|
|
- Click on tags to filter by specific tags
|
|
|
|
**Via REST API:**
|
|
```bash
|
|
# Search by query
|
|
curl "http://your-pi-ip:5000/api/v3/plugins/store/list?query=hockey"
|
|
|
|
# Filter by category
|
|
curl "http://your-pi-ip:5000/api/v3/plugins/store/list?category=sports"
|
|
|
|
# Filter by tags
|
|
curl "http://your-pi-ip:5000/api/v3/plugins/store/list?tags=nhl&tags=hockey"
|
|
```
|
|
|
|
**Via Python:**
|
|
```python
|
|
from src.plugin_system.store_manager import PluginStoreManager
|
|
|
|
store = PluginStoreManager(plugins_dir="plugin-repos")
|
|
|
|
# Search by query
|
|
results = store.search_plugins(query="hockey")
|
|
|
|
# Filter by category
|
|
results = store.search_plugins(category="sports")
|
|
|
|
# Filter by tags
|
|
results = store.search_plugins(tags=["nhl", "hockey"])
|
|
```
|
|
|
|
---
|
|
|
|
## Managing Installed Plugins
|
|
|
|
### List Installed Plugins
|
|
|
|
**Via Web Interface:**
|
|
- Navigate to the "Plugin Manager" tab
|
|
- View all installed plugins with their status
|
|
|
|
**Via REST API:**
|
|
```bash
|
|
curl "http://your-pi-ip:5000/api/v3/plugins/installed"
|
|
```
|
|
|
|
**Via Python:**
|
|
```python
|
|
from src.plugin_system.store_manager import PluginStoreManager
|
|
|
|
store = PluginStoreManager(plugins_dir="plugin-repos")
|
|
for plugin_id in store.list_installed_plugins():
|
|
print(plugin_id)
|
|
```
|
|
|
|
### Enable/Disable Plugins
|
|
|
|
**Via Web Interface:**
|
|
1. Navigate to the "Plugin Manager" tab
|
|
2. Use the toggle switch next to each plugin
|
|
3. Restart the display to apply changes
|
|
|
|
**Via REST API:**
|
|
```bash
|
|
curl -X POST http://your-pi-ip:5000/api/v3/plugins/toggle \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"plugin_id": "clock-simple", "enabled": true}'
|
|
```
|
|
|
|
### Update Plugins
|
|
|
|
**Via Web Interface:**
|
|
1. Navigate to the "Plugin Manager" tab
|
|
2. Click the "Update" button next to the plugin
|
|
3. Wait for the update to complete
|
|
4. Restart the display
|
|
|
|
**Via REST API:**
|
|
```bash
|
|
curl -X POST http://your-pi-ip:5000/api/v3/plugins/update \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"plugin_id": "clock-simple"}'
|
|
```
|
|
|
|
**Via Python:**
|
|
```python
|
|
from src.plugin_system.store_manager import PluginStoreManager
|
|
|
|
store = PluginStoreManager(plugins_dir="plugin-repos")
|
|
success = store.update_plugin('clock-simple')
|
|
```
|
|
|
|
### Uninstall Plugins
|
|
|
|
**Via Web Interface:**
|
|
1. Navigate to the "Plugin Manager" tab
|
|
2. Click the "Uninstall" button next to the plugin
|
|
3. Confirm removal
|
|
4. Restart the display
|
|
|
|
**Via REST API:**
|
|
```bash
|
|
curl -X POST http://your-pi-ip:5000/api/v3/plugins/uninstall \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"plugin_id": "clock-simple"}'
|
|
```
|
|
|
|
**Via Python:**
|
|
```python
|
|
from src.plugin_system.store_manager import PluginStoreManager
|
|
|
|
store = PluginStoreManager(plugins_dir="plugin-repos")
|
|
success = store.uninstall_plugin('clock-simple')
|
|
```
|
|
|
|
---
|
|
|
|
## Configuring Plugins
|
|
|
|
Each plugin can have its own configuration in `config/config.json`:
|
|
|
|
```json
|
|
{
|
|
"clock-simple": {
|
|
"enabled": true,
|
|
"display_duration": 15,
|
|
"color": [255, 255, 255],
|
|
"time_format": "12h"
|
|
},
|
|
"nhl-scores": {
|
|
"enabled": true,
|
|
"favorite_teams": ["TBL", "FLA"],
|
|
"show_favorite_teams_only": true
|
|
}
|
|
}
|
|
```
|
|
|
|
**Via Web Interface:**
|
|
1. Navigate to the "Plugin Manager" tab
|
|
2. Click the Configure (⚙️) button next to the plugin
|
|
3. Edit the configuration in the form
|
|
4. Save changes
|
|
5. Restart the display to apply changes
|
|
|
|
---
|
|
|
|
## Safety and Security
|
|
|
|
### Verified vs Unverified Plugins
|
|
|
|
- **Verified Plugins**: Reviewed by maintainers, follow best practices, no known security issues
|
|
- **Unverified Plugins**: User-contributed, not reviewed, install at your own risk
|
|
|
|
When installing from a custom GitHub URL, you'll see a warning about installing an unverified plugin. The plugin will have access to your display manager, cache manager, configuration files, and network access.
|
|
|
|
### Best Practices
|
|
|
|
1. Only install plugins from trusted sources
|
|
2. Review plugin code before installing (click "View on GitHub")
|
|
3. Keep plugins updated for security patches
|
|
4. Report suspicious plugins to maintainers
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Plugin Won't Install
|
|
|
|
**Problem:** Installation fails
|
|
|
|
**Solutions:**
|
|
- Plugins from the official registry live in the `ledmatrix-plugins`
|
|
monorepo and are downloaded, not cloned: the store fetches the plugin's
|
|
directory through the GitHub API and falls back to extracting it from the
|
|
repository ZIP, so git is not involved (the installed copy has no `.git`)
|
|
- A plugin installed by URL from its own repository is cloned with git,
|
|
falling back to an archive download; check `which git` if that fails
|
|
- Verify the GitHub URL is correct
|
|
- Check your internet connection
|
|
|
|
### Plugin Won't Load
|
|
|
|
**Problem:** Plugin installed but doesn't appear in rotation
|
|
|
|
**Solutions:**
|
|
1. Check that the plugin is enabled in config: `"enabled": true`
|
|
2. Verify manifest.json exists and is valid
|
|
3. Check logs for errors: `sudo journalctl -u ledmatrix -f`
|
|
4. Restart the display service: `sudo systemctl restart ledmatrix`
|
|
|
|
### Dependencies Failed
|
|
|
|
**Problem:** "Error installing dependencies" message
|
|
|
|
**Solutions:**
|
|
- Check that pip3 is installed
|
|
- Manually install: `pip3 install --break-system-packages -r plugins/plugin-id/requirements.txt`
|
|
- Check for conflicting package versions
|
|
|
|
### Plugin Shows Errors
|
|
|
|
**Problem:** Plugin loads but shows error message on display
|
|
|
|
**Solutions:**
|
|
1. Check that the plugin configuration is correct
|
|
2. Verify API keys are set (if the plugin requires them)
|
|
3. Check plugin logs: `sudo journalctl -u ledmatrix -f | grep plugin-id`
|
|
4. Report the issue to the plugin developer on GitHub
|
|
|
|
---
|
|
|
|
## API Reference
|
|
|
|
All API endpoints return JSON with this structure:
|
|
|
|
```json
|
|
{
|
|
"status": "success" | "error",
|
|
"message": "Human-readable message",
|
|
"data": { ... }
|
|
}
|
|
```
|
|
|
|
### Endpoints
|
|
|
|
| Method | Endpoint | Description |
|
|
|--------|----------|-------------|
|
|
| GET | `/api/v3/plugins/store/list` | List plugins in store; `?query=`, `?category=`, `?tags=` search and filter |
|
|
| GET | `/api/v3/plugins/installed` | List installed plugins |
|
|
| POST | `/api/v3/plugins/install` | Install from registry |
|
|
| POST | `/api/v3/plugins/install-from-url` | Install from GitHub URL |
|
|
| POST | `/api/v3/plugins/uninstall` | Uninstall plugin |
|
|
| POST | `/api/v3/plugins/update` | Update plugin |
|
|
| POST | `/api/v3/plugins/toggle` | Enable/disable plugin |
|
|
| POST | `/api/v3/plugins/config` | Update plugin config |
|
|
|
|
---
|
|
|
|
## Examples
|
|
|
|
### Example 1: Install Clock Plugin
|
|
|
|
```bash
|
|
# Install
|
|
curl -X POST http://192.168.1.100:5000/api/v3/plugins/install \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"plugin_id": "clock-simple"}'
|
|
|
|
# Configure in config/config.json
|
|
{
|
|
"clock-simple": {
|
|
"enabled": true,
|
|
"display_duration": 20,
|
|
"time_format": "24h"
|
|
}
|
|
}
|
|
|
|
# Restart display
|
|
sudo systemctl restart ledmatrix
|
|
```
|
|
|
|
### Example 2: Install Custom Plugin from GitHub
|
|
|
|
```bash
|
|
# Install your own plugin during development
|
|
curl -X POST http://192.168.1.100:5000/api/v3/plugins/install-from-url \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"repo_url": "https://github.com/myusername/ledmatrix-my-custom-plugin"}'
|
|
|
|
# Enable it
|
|
curl -X POST http://192.168.1.100:5000/api/v3/plugins/toggle \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"plugin_id": "my-custom-plugin", "enabled": true}'
|
|
|
|
# Restart
|
|
sudo systemctl restart ledmatrix
|
|
```
|
|
|
|
### Example 3: Share Plugin with Others
|
|
|
|
As a plugin developer, you can share your plugin with others even before it's in the official store:
|
|
|
|
1. Push your plugin to GitHub: `https://github.com/yourusername/ledmatrix-awesome-plugin`
|
|
2. Share the URL with users
|
|
3. Users install via:
|
|
- Open the LEDMatrix web interface
|
|
- Open the "Plugin Manager" tab
|
|
- Scroll to "Install from GitHub" → "Install Single Plugin"
|
|
- Paste the URL
|
|
- Click "Install"
|
|
|
|
---
|
|
|
|
## Command-Line Usage
|
|
|
|
For advanced users, manage plugins via command line:
|
|
|
|
```bash
|
|
# Install from registry
|
|
python3 -c "
|
|
from src.plugin_system.store_manager import PluginStoreManager
|
|
store = PluginStoreManager(plugins_dir='plugin-repos')
|
|
store.install_plugin('clock-simple')
|
|
"
|
|
|
|
# Install from URL
|
|
python3 -c "
|
|
from src.plugin_system.store_manager import PluginStoreManager
|
|
store = PluginStoreManager(plugins_dir='plugin-repos')
|
|
result = store.install_from_url('https://github.com/user/plugin')
|
|
print(result)
|
|
"
|
|
|
|
# List installed
|
|
python3 -c "
|
|
from src.plugin_system.store_manager import PluginStoreManager
|
|
store = PluginStoreManager(plugins_dir='plugin-repos')
|
|
for plugin_id in store.list_installed_plugins():
|
|
print(plugin_id)
|
|
"
|
|
|
|
# Uninstall
|
|
python3 -c "
|
|
from src.plugin_system.store_manager import PluginStoreManager
|
|
store = PluginStoreManager(plugins_dir='plugin-repos')
|
|
store.uninstall_plugin('clock-simple')
|
|
"
|
|
```
|
|
|
|
---
|
|
|
|
## FAQ
|
|
|
|
**Q: Do I need to restart the display after installing a plugin?**
|
|
A: Yes, plugins are loaded when the display controller starts.
|
|
|
|
**Q: Can I install plugins while the display is running?**
|
|
A: Yes, you can install anytime, but you must restart the display to load them.
|
|
|
|
**Q: What happens if I install a plugin with the same ID as an existing one?**
|
|
A: The existing copy will be replaced with the latest code from the repository.
|
|
|
|
**Q: Can I install multiple versions of the same plugin?**
|
|
A: No, each plugin ID maps to a single installed copy.
|
|
|
|
**Q: How do I update all plugins at once?**
|
|
A: Click **Check & Update All** at the top of the Plugin Manager tab. You can
|
|
also turn on weekly automatic updates (off by default) in the General tab;
|
|
they update LEDMatrix itself and then the installed plugins
|
|
(`web_interface/auto_update.py`).
|
|
|
|
**Q: How does the store know an update is available?**
|
|
A: For registry plugins it compares the installed manifest's `version` with
|
|
the registry's `latest_version`; git tags and releases are not consulted.
|
|
|
|
**Q: Can plugins access my API keys from config_secrets.json?**
|
|
A: Yes, if a plugin needs API keys, it can access them like core managers do.
|
|
|
|
**Q: How much disk space do plugins use?**
|
|
A: Most plugins are small (1-5MB). Check individual plugin documentation for specific requirements.
|
|
|
|
**Q: Can I create my own plugin?**
|
|
A: Yes! See [PLUGIN_DEVELOPMENT_GUIDE.md](PLUGIN_DEVELOPMENT_GUIDE.md) for instructions.
|
|
|
|
---
|
|
|
|
## Related Documentation
|
|
|
|
- [PLUGIN_DEVELOPMENT_GUIDE.md](PLUGIN_DEVELOPMENT_GUIDE.md) - Create your own plugins
|
|
- [PLUGIN_API_REFERENCE.md](PLUGIN_API_REFERENCE.md) - Plugin API documentation
|
|
- [PLUGIN_ARCHITECTURE_SPEC.md](PLUGIN_ARCHITECTURE_SPEC.md) - Plugin system architecture (historical)
|
|
- [REST_API_REFERENCE.md](REST_API_REFERENCE.md) - Complete REST API reference
|