* 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>
15 KiB
WiFi Network Setup Guide
Overview
The LEDMatrix WiFi system provides automatic network configuration with intelligent failover to Access Point (AP) mode. When your Raspberry Pi loses network connectivity, it automatically creates a WiFi access point for easy configuration—ensuring you can always connect to your device.
Key Features
- Automatic AP Mode: Creates a WiFi access point when network connection is lost
- Intelligent Failover: Only activates after a grace period to prevent false positives
- Dual Connectivity: Supports both WiFi and Ethernet with automatic priority management
- Web Interface: Configure WiFi through an easy-to-use web interface
- Network Scanning: Scan and connect to available WiFi networks
- Secure Storage: WiFi credentials stored securely
Quick Start
Accessing WiFi Setup
If not connected to WiFi:
- Wait 90 seconds after boot (AP mode activation grace period)
- Connect to WiFi network LEDMatrix-Setup (an open network: no password)
- Open browser to:
http://192.168.4.1:5000 - Open the WiFi tab
- Scan, select your network, and connect
If already connected:
- Open browser to:
http://your-pi-ip:5000 - Navigate to the WiFi tab
- Configure as needed
Installation
Prerequisites
The following packages are required:
- hostapd - Access point software
- dnsmasq - DHCP server for AP mode
- NetworkManager - WiFi management
Install WiFi Monitor Service
cd /home/ledpi/LEDMatrix
sudo ./scripts/install/install_wifi_monitor.sh
This script will:
- Check for required packages and offer to install them
- Create the systemd service file
- Enable and start the WiFi monitor service
- Configure the service to start on boot
Verify Installation
# Check service status
sudo systemctl status ledmatrix-wifi-monitor
# Run verification script
./scripts/verify_wifi_setup.sh
Configuration
Configuration File
WiFi settings are stored in config/wifi_config.json:
{
"ap_ssid": "LEDMatrix-Setup",
"ap_channel": 7,
"auto_enable_ap_mode": true
}
Configuration Options
| Setting | Default | Description |
|---|---|---|
ap_ssid |
LEDMatrix-Setup |
Network name broadcast in AP mode |
ap_channel |
7 |
WiFi channel (1, 6, or 11 are non-overlapping) |
auto_enable_ap_mode |
true |
Automatically enable AP mode when both WiFi and Ethernet are disconnected |
Auto-Enable AP Mode Behavior
When enabled (true - recommended):
- AP mode activates automatically after 90-second grace period
- Only when both WiFi AND Ethernet are disconnected
- Automatically disables when either WiFi or Ethernet connects
- Best for portable devices or unreliable network environments
When disabled (false):
- AP mode must be manually enabled through web interface
- Prevents unnecessary AP activation
- Best for devices with stable network connections
Using WiFi Setup
Connecting to a WiFi Network
Via Web Interface:
- Navigate to the WiFi tab
- Click Scan to search for networks
- Select a network from the dropdown (or enter SSID manually)
- Enter the WiFi password (leave empty for open networks)
- Click Connect
- System will attempt connection
- AP mode automatically disables once connected
Via API:
# Scan for networks
curl "http://your-pi-ip:5000/api/v3/wifi/scan"
# Connect to network
curl -X POST http://your-pi-ip:5000/api/v3/wifi/connect \
-H "Content-Type: application/json" \
-d '{"ssid": "YourNetwork", "password": "your-password"}'
Manual AP Mode Control
Via Web Interface:
- Enable AP Mode: Click "Enable AP Mode" button (only when WiFi/Ethernet disconnected)
- Disable AP Mode: Click "Disable AP Mode" button (when AP is active)
Via API:
# Enable AP mode
curl -X POST http://your-pi-ip:5000/api/v3/wifi/ap/enable
# Disable AP mode
curl -X POST http://your-pi-ip:5000/api/v3/wifi/ap/disable
Note: Manual enable still requires both WiFi and Ethernet to be disconnected.
Understanding AP Mode Failover
How the Grace Period Works
The system uses a grace period mechanism to prevent false positives from temporary network hiccups:
Check Interval: 30 seconds (default)
Required Checks: 3 consecutive
Grace Period: 90 seconds total
Timeline Example:
Time 0s: WiFi disconnects
Time 30s: Check 1 - Disconnected (counter = 1)
Time 60s: Check 2 - Disconnected (counter = 2)
Time 90s: Check 3 - Disconnected (counter = 3) → AP MODE ENABLED
If WiFi or Ethernet reconnects at any point, the counter resets to 0.
Why Grace Period is Important
Without a grace period, AP mode would activate during:
- Brief network hiccups
- Router reboots
- Temporary signal interference
- NetworkManager reconnection attempts
The 90-second grace period ensures AP mode only activates during sustained disconnection.
Connection Priority
The system checks connections in this order:
- WiFi Connection (highest priority)
- Ethernet Connection (fallback)
- AP Mode (last resort - only when both WiFi and Ethernet disconnected)
Behavior Summary
| WiFi Status | Ethernet Status | Auto-Enable | AP Mode Behavior |
|---|---|---|---|
| Any | Any | false |
Manual enable only |
| Connected | Any | true |
Disabled |
| Disconnected | Connected | true |
Disabled (Ethernet available) |
| Disconnected | Disconnected | true |
Auto-enabled after 90s |
Access Point Configuration
AP Mode Settings
- SSID:
LEDMatrix-Setup(configurable viaap_ssid) - Network: open (no password). Both AP paths create an open network
(
_create_hostapd_config()and_enable_ap_mode_nmcli_hotspot()insrc/wifi_manager.py); anap_passwordkey inwifi_config.jsonis not read - IP Address: 192.168.4.1
- DHCP Range: 192.168.4.2 – 192.168.4.20
- Channel: 7 (configurable via
ap_channel)
Accessing Services in AP Mode
When AP mode is active:
- Web Interface:
http://192.168.4.1:5000 - SSH:
ssh ledpi@192.168.4.1 - Captive portal may automatically redirect browsers
Best Practices
Security Recommendations
1. Keep AP mode short-lived:
The setup network is open, so anyone nearby can join it and reach the web
interface while it is up. AP mode only comes up when WiFi and Ethernet are
both disconnected (after the 90 second grace period) and goes down again once
the Pi is connected; in a public area, consider setting
auto_enable_ap_mode to false and enabling AP mode by hand when needed.
2. Use Non-Overlapping WiFi Channels:
- Channels 1, 6, 11 are non-overlapping (2.4GHz)
- Choose a channel that doesn't conflict with your primary network
- Example: If primary uses channel 1, use channel 11 for AP mode
3. Secure WiFi Credentials:
sudo chmod 600 config/wifi_config.json
Network Configuration Tips
Multiple Networks:
NetworkManager remembers every network you connect to and rejoins whichever is
in range; list them with nmcli connection show. LEDMatrix itself does not
store WiFi passwords.
Adjust Check Interval:
Edit the systemd service file to change grace period:
sudo systemctl edit ledmatrix-wifi-monitor
Add:
[Service]
ExecStart=
ExecStart=/usr/bin/python3 /path/to/LEDMatrix/scripts/utils/wifi_monitor_daemon.py --interval 20
Note: Interval affects grace period:
- 20-second interval = 60-second grace period (3 × 20)
- 30-second interval = 90-second grace period (3 × 30) ← Default
- 60-second interval = 180-second grace period (3 × 60)
Configuration Scenarios
Scenario 1: Portable Device with Auto-Failover (Recommended)
Use Case: Device may lose WiFi connection
Configuration:
{
"auto_enable_ap_mode": true
}
Behavior:
- AP mode activates automatically after 90 seconds of disconnection
- Always provides a way to connect
- Best for devices that move or have unreliable WiFi
Scenario 2: Stable Network Connection
Use Case: Ethernet or reliable WiFi connection
Configuration:
{
"auto_enable_ap_mode": false
}
Behavior:
- AP mode must be manually enabled
- Prevents unnecessary activation
- Best for stationary devices with stable connections
Scenario 3: Ethernet Primary with WiFi Backup
Use Case: Primary Ethernet, WiFi as backup
Configuration:
{
"auto_enable_ap_mode": true
}
Behavior:
- Ethernet connection prevents AP mode activation
- If Ethernet disconnects, WiFi is attempted
- If both disconnect, AP mode activates after grace period
- Best for devices with both Ethernet and WiFi
Troubleshooting
AP Mode Not Activating
Check 1: Auto-Enable Setting
cat config/wifi_config.json | grep auto_enable_ap_mode
Should show "auto_enable_ap_mode": true
Check 2: Service Status
sudo systemctl status ledmatrix-wifi-monitor
Service should be active (running)
Check 3: Grace Period
- Wait at least 90 seconds after disconnection
- Check logs:
sudo journalctl -u ledmatrix-wifi-monitor -f
Check 4: Ethernet Connection
- If Ethernet is connected, AP mode won't activate
- Verify:
nmcli device status - Disconnect Ethernet to test AP mode
Check 5: Required Packages
# Verify hostapd is installed
which hostapd
# Verify dnsmasq is installed
which dnsmasq
Cannot Access AP Mode
Check 1: AP Mode Active
sudo systemctl status hostapd
sudo systemctl status dnsmasq
Both should be running
Check 2: Network Interface
ip addr show wlan0
Should show IP 192.168.4.1
Check 3: WiFi Interface Available
ip link show wlan0
Interface should exist
Check 4: Try Manual Enable
- Use web interface: WiFi tab → Enable AP Mode
- Or via API:
curl -X POST http://localhost:5000/api/v3/wifi/ap/enable
Cannot Connect to WiFi Network
Check 1: Verify Credentials
- Ensure SSID and password are correct
- Check for hidden networks (manual SSID entry required)
Check 2: Check Logs
# WiFi monitor logs
sudo journalctl -u ledmatrix-wifi-monitor -f
# NetworkManager logs
sudo journalctl -u NetworkManager -n 50
Check 3: Network Compatibility
- Verify network is 2.4GHz (5GHz may not be supported on all Pi models)
- Check if network requires special authentication
AP Mode Not Disabling After WiFi Connect
Check 1: WiFi Connection Status
nmcli device status
Check 2: Manually Disable
- Use web interface: WiFi tab → Disable AP Mode
- Or restart service:
sudo systemctl restart ledmatrix-wifi-monitor
Check 3: Check Logs
sudo journalctl -u ledmatrix-wifi-monitor -n 50
AP Mode Activating Unexpectedly
Check 1: Network Stability
- Verify WiFi connection is stable
- Check router status
- Check signal strength
Check 2: Disable Auto-Enable
nano config/wifi_config.json
# Change: "auto_enable_ap_mode": false
sudo systemctl restart ledmatrix-wifi-monitor
Check 3: Increase Grace Period
- Edit service file to increase check interval
- Longer interval = longer grace period
- See "Best Practices" section above
Monitoring and Diagnostics
Check WiFi Status
Via Python:
from src.wifi_manager import WiFiManager
wm = WiFiManager()
status = wm.get_wifi_status()
print(f'Connected: {status.connected}')
print(f'SSID: {status.ssid}')
print(f'IP Address: {status.ip_address}')
print(f'AP Mode Active: {status.ap_mode_active}')
print(f'Auto-Enable: {wm.config.get("auto_enable_ap_mode", False)}')
Via NetworkManager:
# View device status
nmcli device status
# View connections
nmcli connection show
# View available WiFi networks
nmcli device wifi list
View Service Logs
# Real-time logs
sudo journalctl -u ledmatrix-wifi-monitor -f
# Recent logs (last 50 lines)
sudo journalctl -u ledmatrix-wifi-monitor -n 50
# Logs from specific time
sudo journalctl -u ledmatrix-wifi-monitor --since "1 hour ago"
Run Verification Script
cd /home/ledpi/LEDMatrix
./scripts/verify_wifi_setup.sh
Checks:
- Required packages installed
- WiFi monitor service running
- Configuration files valid
- WiFi interface available
- Current connection status
- AP mode status
Service Management
Useful Commands
# Check service status
sudo systemctl status ledmatrix-wifi-monitor
# Start the service
sudo systemctl start ledmatrix-wifi-monitor
# Stop the service
sudo systemctl stop ledmatrix-wifi-monitor
# Restart the service
sudo systemctl restart ledmatrix-wifi-monitor
# View logs
sudo journalctl -u ledmatrix-wifi-monitor -f
# Disable service from starting on boot
sudo systemctl disable ledmatrix-wifi-monitor
# Enable service to start on boot
sudo systemctl enable ledmatrix-wifi-monitor
API Reference
The WiFi setup feature exposes the following API endpoints:
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/v3/wifi/status |
Get current WiFi connection status |
| GET | /api/v3/wifi/scan |
Scan for available WiFi networks |
| POST | /api/v3/wifi/connect |
Connect to a WiFi network |
| POST | /api/v3/wifi/ap/enable |
Enable access point mode |
| POST | /api/v3/wifi/ap/disable |
Disable access point mode |
| GET | /api/v3/wifi/ap/auto-enable |
Get auto-enable setting |
| POST | /api/v3/wifi/ap/auto-enable |
Set auto-enable setting |
Example Usage
# Get WiFi status
curl "http://your-pi-ip:5000/api/v3/wifi/status"
# Scan for networks
curl "http://your-pi-ip:5000/api/v3/wifi/scan"
# Connect to network
curl -X POST http://your-pi-ip:5000/api/v3/wifi/connect \
-H "Content-Type: application/json" \
-d '{"ssid": "MyNetwork", "password": "mypassword"}'
# Enable AP mode
curl -X POST http://your-pi-ip:5000/api/v3/wifi/ap/enable
# Check auto-enable setting
curl "http://your-pi-ip:5000/api/v3/wifi/ap/auto-enable"
# Set auto-enable
curl -X POST http://your-pi-ip:5000/api/v3/wifi/ap/auto-enable \
-H "Content-Type: application/json" \
-d '{"auto_enable_ap_mode": true}'
Technical Details
WiFi Monitor Daemon
The WiFi monitor daemon (wifi_monitor_daemon.py) runs as a background service that:
- Checks WiFi and Ethernet connection status every 30 seconds (configurable)
- Maintains disconnected check counter for grace period
- Automatically enables AP mode when:
auto_enable_ap_modeis enabled AND- Both WiFi and Ethernet disconnected AND
- Grace period elapsed (3 consecutive checks)
- Automatically disables AP mode when WiFi or Ethernet connects
- Logs all state changes
WiFi Detection Methods
The WiFi manager tries multiple methods:
- NetworkManager (nmcli) - Preferred method
- iwconfig - Fallback for systems without NetworkManager
Network Scanning Methods
- nmcli - Fast, preferred method
- iwlist - Fallback for older systems
Access Point Implementation
- Uses
hostapdfor WiFi access point functionality - Uses
dnsmasqfor DHCP and DNS services - Configures wlan0 interface with IP 192.168.4.1
- Provides DHCP range: 192.168.4.2-20
- Captive portal with DNS redirection
Related Documentation
- WEB_INTERFACE_GUIDE.md - Using the web interface
- TROUBLESHOOTING.md - General troubleshooting
- GETTING_STARTED.md - Initial setup guide