mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-04-11 21:33:00 +00:00
wiki updates
This commit is contained in:
1
LEDMatrix.wiki
Submodule
1
LEDMatrix.wiki
Submodule
Submodule LEDMatrix.wiki added at 73cbadbd7a
587
WIKI_ARCHITECTURE.md
Normal file
587
WIKI_ARCHITECTURE.md
Normal file
@@ -0,0 +1,587 @@
|
|||||||
|
# System Architecture
|
||||||
|
|
||||||
|
The LEDMatrix system is built with a modular, extensible architecture that separates concerns and allows for easy maintenance and extension. This guide explains how all components work together.
|
||||||
|
|
||||||
|
## System Overview
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ LEDMatrix System │
|
||||||
|
├─────────────────────────────────────────────────────────────┤
|
||||||
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||||
|
│ │ Display │ │ Display │ │ Display │ │
|
||||||
|
│ │ Controller │ │ Manager │ │ Managers │ │
|
||||||
|
│ │ │ │ │ │ │ │
|
||||||
|
│ │ • Main Loop │ │ • Hardware │ │ • Weather │ │
|
||||||
|
│ │ • Rotation │ │ • Rendering │ │ • Stocks │ │
|
||||||
|
│ │ • Scheduling│ │ • Fonts │ │ • Sports │ │
|
||||||
|
│ │ • Live Mode │ │ • Graphics │ │ • Music │ │
|
||||||
|
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||||||
|
├─────────────────────────────────────────────────────────────┤
|
||||||
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||||
|
│ │ Config │ │ Cache │ │ Web │ │
|
||||||
|
│ │ Manager │ │ Manager │ │ Interface │ │
|
||||||
|
│ │ │ │ │ │ │ │
|
||||||
|
│ │ • Settings │ │ • Data │ │ • Control │ │
|
||||||
|
│ │ • Validation│ │ • Persistence│ │ • Status │ │
|
||||||
|
│ │ • Loading │ │ • Fallbacks │ │ • Settings │ │
|
||||||
|
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Core Components
|
||||||
|
|
||||||
|
### 1. Display Controller (`src/display_controller.py`)
|
||||||
|
|
||||||
|
**Purpose**: Main orchestrator that manages the entire display system.
|
||||||
|
|
||||||
|
**Responsibilities**:
|
||||||
|
- Initialize all display managers
|
||||||
|
- Control display rotation and timing
|
||||||
|
- Handle live game priority
|
||||||
|
- Manage system scheduling
|
||||||
|
- Coordinate data updates
|
||||||
|
- Handle error recovery
|
||||||
|
|
||||||
|
**Key Methods**:
|
||||||
|
```python
|
||||||
|
class DisplayController:
|
||||||
|
def __init__(self):
|
||||||
|
# Initialize all managers and configuration
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
# Main display loop
|
||||||
|
|
||||||
|
def _update_modules(self):
|
||||||
|
# Update all enabled modules
|
||||||
|
|
||||||
|
def _check_live_games(self):
|
||||||
|
# Check for live games and prioritize
|
||||||
|
|
||||||
|
def _rotate_team_games(self, sport):
|
||||||
|
# Rotate through team games
|
||||||
|
```
|
||||||
|
|
||||||
|
**Data Flow**:
|
||||||
|
1. Load configuration
|
||||||
|
2. Initialize display managers
|
||||||
|
3. Start main loop
|
||||||
|
4. Check for live games
|
||||||
|
5. Rotate through enabled displays
|
||||||
|
6. Handle scheduling and timing
|
||||||
|
|
||||||
|
### 2. Display Manager (`src/display_manager.py`)
|
||||||
|
|
||||||
|
**Purpose**: Low-level hardware interface and graphics rendering.
|
||||||
|
|
||||||
|
**Responsibilities**:
|
||||||
|
- Initialize RGB LED matrix hardware
|
||||||
|
- Handle font loading and management
|
||||||
|
- Provide drawing primitives
|
||||||
|
- Manage display buffers
|
||||||
|
- Handle hardware configuration
|
||||||
|
- Provide text rendering utilities
|
||||||
|
|
||||||
|
**Key Features**:
|
||||||
|
```python
|
||||||
|
class DisplayManager:
|
||||||
|
def __init__(self, config):
|
||||||
|
# Initialize hardware and fonts
|
||||||
|
|
||||||
|
def draw_text(self, text, x, y, color, font):
|
||||||
|
# Draw text on display
|
||||||
|
|
||||||
|
def update_display(self):
|
||||||
|
# Update physical display
|
||||||
|
|
||||||
|
def clear(self):
|
||||||
|
# Clear display
|
||||||
|
|
||||||
|
def draw_weather_icon(self, condition, x, y, size):
|
||||||
|
# Draw weather icons
|
||||||
|
```
|
||||||
|
|
||||||
|
**Hardware Interface**:
|
||||||
|
- RGB Matrix library integration
|
||||||
|
- GPIO pin management
|
||||||
|
- PWM timing control
|
||||||
|
- Double buffering for smooth updates
|
||||||
|
- Font rendering (TTF and BDF)
|
||||||
|
|
||||||
|
### 3. Configuration Manager (`src/config_manager.py`)
|
||||||
|
|
||||||
|
**Purpose**: Load, validate, and manage system configuration.
|
||||||
|
|
||||||
|
**Responsibilities**:
|
||||||
|
- Load JSON configuration files
|
||||||
|
- Validate configuration syntax
|
||||||
|
- Provide default values
|
||||||
|
- Handle configuration updates
|
||||||
|
- Manage secrets and API keys
|
||||||
|
|
||||||
|
**Configuration Sources**:
|
||||||
|
```python
|
||||||
|
class ConfigManager:
|
||||||
|
def load_config(self):
|
||||||
|
# Load main config.json
|
||||||
|
|
||||||
|
def load_secrets(self):
|
||||||
|
# Load config_secrets.json
|
||||||
|
|
||||||
|
def validate_config(self):
|
||||||
|
# Validate configuration
|
||||||
|
|
||||||
|
def get_defaults(self):
|
||||||
|
# Provide default values
|
||||||
|
```
|
||||||
|
|
||||||
|
**Configuration Structure**:
|
||||||
|
- Main settings in `config/config.json`
|
||||||
|
- API keys in `config/config_secrets.json`
|
||||||
|
- Validation and error handling
|
||||||
|
- Default value fallbacks
|
||||||
|
|
||||||
|
### 4. Cache Manager (`src/cache_manager.py`)
|
||||||
|
|
||||||
|
**Purpose**: Intelligent data caching to reduce API calls and improve performance.
|
||||||
|
|
||||||
|
**Responsibilities**:
|
||||||
|
- Store API responses
|
||||||
|
- Manage cache expiration
|
||||||
|
- Handle cache persistence
|
||||||
|
- Provide fallback data
|
||||||
|
- Optimize storage usage
|
||||||
|
|
||||||
|
**Cache Strategy**:
|
||||||
|
```python
|
||||||
|
class CacheManager:
|
||||||
|
def get(self, key):
|
||||||
|
# Retrieve cached data
|
||||||
|
|
||||||
|
def set(self, key, data, ttl):
|
||||||
|
# Store data with expiration
|
||||||
|
|
||||||
|
def is_valid(self, key):
|
||||||
|
# Check if cache is still valid
|
||||||
|
|
||||||
|
def clear_expired(self):
|
||||||
|
# Remove expired cache entries
|
||||||
|
```
|
||||||
|
|
||||||
|
**Cache Locations** (in order of preference):
|
||||||
|
1. `~/.ledmatrix_cache/` (user's home directory)
|
||||||
|
2. `/var/cache/ledmatrix/` (system cache directory)
|
||||||
|
3. `/tmp/ledmatrix_cache/` (temporary directory)
|
||||||
|
|
||||||
|
## Display Manager Architecture
|
||||||
|
|
||||||
|
### Manager Interface
|
||||||
|
|
||||||
|
All display managers follow a consistent interface:
|
||||||
|
|
||||||
|
```python
|
||||||
|
class BaseManager:
|
||||||
|
def __init__(self, config, display_manager):
|
||||||
|
self.config = config
|
||||||
|
self.display_manager = display_manager
|
||||||
|
self.cache_manager = CacheManager()
|
||||||
|
|
||||||
|
def update_data(self):
|
||||||
|
"""Fetch and process new data"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def display(self, force_clear=False):
|
||||||
|
"""Render content to display"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def is_enabled(self):
|
||||||
|
"""Check if manager is enabled"""
|
||||||
|
return self.config.get('enabled', False)
|
||||||
|
|
||||||
|
def get_duration(self):
|
||||||
|
"""Get display duration"""
|
||||||
|
return self.config.get('duration', 30)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Flow Pattern
|
||||||
|
|
||||||
|
Each manager follows this pattern:
|
||||||
|
|
||||||
|
1. **Initialization**: Load configuration and setup
|
||||||
|
2. **Data Fetching**: Retrieve data from APIs or local sources
|
||||||
|
3. **Caching**: Store data using CacheManager
|
||||||
|
4. **Processing**: Transform raw data into display format
|
||||||
|
5. **Rendering**: Use DisplayManager to show content
|
||||||
|
6. **Cleanup**: Return control to main controller
|
||||||
|
|
||||||
|
### Error Handling
|
||||||
|
|
||||||
|
- **API Failures**: Fall back to cached data
|
||||||
|
- **Network Issues**: Use last known good data
|
||||||
|
- **Invalid Data**: Filter out bad entries
|
||||||
|
- **Hardware Errors**: Graceful degradation
|
||||||
|
- **Configuration Errors**: Use safe defaults
|
||||||
|
|
||||||
|
## Sports Manager Architecture
|
||||||
|
|
||||||
|
### Sports Manager Pattern
|
||||||
|
|
||||||
|
Each sport follows a three-manager pattern:
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Live games (currently playing)
|
||||||
|
class NHLLiveManager(BaseSportsManager):
|
||||||
|
def fetch_games(self):
|
||||||
|
# Get currently playing games
|
||||||
|
|
||||||
|
def display_games(self):
|
||||||
|
# Show live scores and status
|
||||||
|
|
||||||
|
# Recent games (completed)
|
||||||
|
class NHLRecentManager(BaseSportsManager):
|
||||||
|
def fetch_games(self):
|
||||||
|
# Get recently completed games
|
||||||
|
|
||||||
|
def display_games(self):
|
||||||
|
# Show final scores
|
||||||
|
|
||||||
|
# Upcoming games (scheduled)
|
||||||
|
class NHLUpcomingManager(BaseSportsManager):
|
||||||
|
def fetch_games(self):
|
||||||
|
# Get scheduled games
|
||||||
|
|
||||||
|
def display_games(self):
|
||||||
|
# Show game times and matchups
|
||||||
|
```
|
||||||
|
|
||||||
|
### Base Sports Manager
|
||||||
|
|
||||||
|
Common functionality shared by all sports:
|
||||||
|
|
||||||
|
```python
|
||||||
|
class BaseSportsManager:
|
||||||
|
def __init__(self, config, display_manager):
|
||||||
|
# Common initialization
|
||||||
|
|
||||||
|
def fetch_espn_data(self, sport, endpoint):
|
||||||
|
# Fetch from ESPN API
|
||||||
|
|
||||||
|
def process_game_data(self, games):
|
||||||
|
# Process raw game data
|
||||||
|
|
||||||
|
def display_game(self, game):
|
||||||
|
# Display individual game
|
||||||
|
|
||||||
|
def get_team_logo(self, team_abbr):
|
||||||
|
# Load team logo
|
||||||
|
|
||||||
|
def format_score(self, score):
|
||||||
|
# Format score display
|
||||||
|
```
|
||||||
|
|
||||||
|
### ESPN API Integration
|
||||||
|
|
||||||
|
All sports use ESPN's API for data:
|
||||||
|
|
||||||
|
```python
|
||||||
|
def fetch_espn_data(self, sport, endpoint):
|
||||||
|
url = f"http://site.api.espn.com/apis/site/v2/sports/{sport}/{endpoint}"
|
||||||
|
response = requests.get(url)
|
||||||
|
return response.json()
|
||||||
|
```
|
||||||
|
|
||||||
|
**Supported Sports**:
|
||||||
|
- NHL (hockey)
|
||||||
|
- NBA (basketball)
|
||||||
|
- MLB (baseball)
|
||||||
|
- NFL (football)
|
||||||
|
- NCAA Football
|
||||||
|
- NCAA Basketball
|
||||||
|
- NCAA Baseball
|
||||||
|
- Soccer (multiple leagues)
|
||||||
|
- MiLB (minor league baseball)
|
||||||
|
|
||||||
|
## Financial Data Architecture
|
||||||
|
|
||||||
|
### Stock Manager
|
||||||
|
|
||||||
|
```python
|
||||||
|
class StockManager:
|
||||||
|
def __init__(self, config, display_manager):
|
||||||
|
# Initialize stock and crypto settings
|
||||||
|
|
||||||
|
def fetch_stock_data(self, symbol):
|
||||||
|
# Fetch from Yahoo Finance
|
||||||
|
|
||||||
|
def fetch_crypto_data(self, symbol):
|
||||||
|
# Fetch crypto data
|
||||||
|
|
||||||
|
def display_stocks(self):
|
||||||
|
# Show stock ticker
|
||||||
|
|
||||||
|
def display_crypto(self):
|
||||||
|
# Show crypto prices
|
||||||
|
```
|
||||||
|
|
||||||
|
### Stock News Manager
|
||||||
|
|
||||||
|
```python
|
||||||
|
class StockNewsManager:
|
||||||
|
def __init__(self, config, display_manager):
|
||||||
|
# Initialize news settings
|
||||||
|
|
||||||
|
def fetch_news(self, symbols):
|
||||||
|
# Fetch financial news
|
||||||
|
|
||||||
|
def display_news(self):
|
||||||
|
# Show news headlines
|
||||||
|
```
|
||||||
|
|
||||||
|
## Weather Architecture
|
||||||
|
|
||||||
|
### Weather Manager
|
||||||
|
|
||||||
|
```python
|
||||||
|
class WeatherManager:
|
||||||
|
def __init__(self, config, display_manager):
|
||||||
|
# Initialize weather settings
|
||||||
|
|
||||||
|
def fetch_weather(self):
|
||||||
|
# Fetch from OpenWeatherMap
|
||||||
|
|
||||||
|
def display_current_weather(self):
|
||||||
|
# Show current conditions
|
||||||
|
|
||||||
|
def display_hourly_forecast(self):
|
||||||
|
# Show hourly forecast
|
||||||
|
|
||||||
|
def display_daily_forecast(self):
|
||||||
|
# Show daily forecast
|
||||||
|
```
|
||||||
|
|
||||||
|
### Weather Icons
|
||||||
|
|
||||||
|
```python
|
||||||
|
class WeatherIcons:
|
||||||
|
def __init__(self):
|
||||||
|
# Load weather icon definitions
|
||||||
|
|
||||||
|
def get_icon(self, condition):
|
||||||
|
# Get icon for weather condition
|
||||||
|
|
||||||
|
def draw_icon(self, condition, x, y, size):
|
||||||
|
# Draw weather icon
|
||||||
|
```
|
||||||
|
|
||||||
|
## Music Architecture
|
||||||
|
|
||||||
|
### Music Manager
|
||||||
|
|
||||||
|
```python
|
||||||
|
class MusicManager:
|
||||||
|
def __init__(self, display_manager, config):
|
||||||
|
# Initialize music settings
|
||||||
|
|
||||||
|
def start_polling(self):
|
||||||
|
# Start background polling
|
||||||
|
|
||||||
|
def update_music_display(self):
|
||||||
|
# Update music information
|
||||||
|
|
||||||
|
def display_spotify(self):
|
||||||
|
# Display Spotify info
|
||||||
|
|
||||||
|
def display_ytm(self):
|
||||||
|
# Display YouTube Music info
|
||||||
|
```
|
||||||
|
|
||||||
|
### Spotify Client
|
||||||
|
|
||||||
|
```python
|
||||||
|
class SpotifyClient:
|
||||||
|
def __init__(self, config):
|
||||||
|
# Initialize Spotify API
|
||||||
|
|
||||||
|
def authenticate(self):
|
||||||
|
# Handle OAuth authentication
|
||||||
|
|
||||||
|
def get_current_track(self):
|
||||||
|
# Get currently playing track
|
||||||
|
```
|
||||||
|
|
||||||
|
### YouTube Music Client
|
||||||
|
|
||||||
|
```python
|
||||||
|
class YTMClient:
|
||||||
|
def __init__(self, config):
|
||||||
|
# Initialize YTM companion server
|
||||||
|
|
||||||
|
def get_current_track(self):
|
||||||
|
# Get current track from YTMD
|
||||||
|
```
|
||||||
|
|
||||||
|
## Web Interface Architecture
|
||||||
|
|
||||||
|
### Web Interface
|
||||||
|
|
||||||
|
```python
|
||||||
|
class WebInterface:
|
||||||
|
def __init__(self, config):
|
||||||
|
# Initialize Flask app
|
||||||
|
|
||||||
|
def start_server(self):
|
||||||
|
# Start web server
|
||||||
|
|
||||||
|
def get_status(self):
|
||||||
|
# Get system status
|
||||||
|
|
||||||
|
def control_display(self, action):
|
||||||
|
# Control display actions
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- System status monitoring
|
||||||
|
- Display control (start/stop)
|
||||||
|
- Configuration management
|
||||||
|
- Service management
|
||||||
|
- Real-time status updates
|
||||||
|
|
||||||
|
## Service Architecture
|
||||||
|
|
||||||
|
### Systemd Service
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=LEDMatrix Display Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
WorkingDirectory=/home/ledpi/LEDMatrix
|
||||||
|
ExecStart=/usr/bin/python3 display_controller.py
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
**Service Features**:
|
||||||
|
- Automatic startup
|
||||||
|
- Crash recovery
|
||||||
|
- Log management
|
||||||
|
- Resource monitoring
|
||||||
|
|
||||||
|
## Data Flow Architecture
|
||||||
|
|
||||||
|
### 1. Configuration Loading
|
||||||
|
|
||||||
|
```
|
||||||
|
config.json → ConfigManager → DisplayController → Display Managers
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Data Fetching
|
||||||
|
|
||||||
|
```
|
||||||
|
API Sources → CacheManager → Display Managers → Display Manager
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Display Rendering
|
||||||
|
|
||||||
|
```
|
||||||
|
Display Managers → Display Manager → RGB Matrix → LED Display
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. User Control
|
||||||
|
|
||||||
|
```
|
||||||
|
Web Interface → Display Controller → Display Managers
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance Architecture
|
||||||
|
|
||||||
|
### Caching Strategy
|
||||||
|
|
||||||
|
1. **API Response Caching**: Store API responses with TTL
|
||||||
|
2. **Processed Data Caching**: Cache processed display data
|
||||||
|
3. **Font Caching**: Cache loaded fonts
|
||||||
|
4. **Image Caching**: Cache team logos and icons
|
||||||
|
|
||||||
|
### Resource Management
|
||||||
|
|
||||||
|
1. **Memory Usage**: Monitor and optimize memory usage
|
||||||
|
2. **CPU Usage**: Minimize processing overhead
|
||||||
|
3. **Network Usage**: Optimize API calls
|
||||||
|
4. **Storage Usage**: Manage cache storage
|
||||||
|
|
||||||
|
### Error Recovery
|
||||||
|
|
||||||
|
1. **API Failures**: Use cached data
|
||||||
|
2. **Network Issues**: Retry with exponential backoff
|
||||||
|
3. **Hardware Errors**: Graceful degradation
|
||||||
|
4. **Configuration Errors**: Use safe defaults
|
||||||
|
|
||||||
|
## Extension Architecture
|
||||||
|
|
||||||
|
### Adding New Display Managers
|
||||||
|
|
||||||
|
1. **Create Manager Class**: Extend base manager pattern
|
||||||
|
2. **Add Configuration**: Add to config.json
|
||||||
|
3. **Register in Controller**: Add to DisplayController
|
||||||
|
4. **Add Assets**: Include logos, icons, fonts
|
||||||
|
5. **Test Integration**: Verify with main system
|
||||||
|
|
||||||
|
### Example New Manager
|
||||||
|
|
||||||
|
```python
|
||||||
|
class CustomManager(BaseManager):
|
||||||
|
def __init__(self, config, display_manager):
|
||||||
|
super().__init__(config, display_manager)
|
||||||
|
|
||||||
|
def update_data(self):
|
||||||
|
# Fetch custom data
|
||||||
|
|
||||||
|
def display(self, force_clear=False):
|
||||||
|
# Display custom content
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security Architecture
|
||||||
|
|
||||||
|
### API Key Management
|
||||||
|
|
||||||
|
1. **Separate Secrets**: Store in config_secrets.json
|
||||||
|
2. **Environment Variables**: Support for env vars
|
||||||
|
3. **Access Control**: Restrict file permissions
|
||||||
|
4. **Key Rotation**: Support for key updates
|
||||||
|
|
||||||
|
### Network Security
|
||||||
|
|
||||||
|
1. **HTTPS Only**: Use secure API endpoints
|
||||||
|
2. **Rate Limiting**: Respect API limits
|
||||||
|
3. **Error Handling**: Don't expose sensitive data
|
||||||
|
4. **Logging**: Secure log management
|
||||||
|
|
||||||
|
## Monitoring Architecture
|
||||||
|
|
||||||
|
### Logging System
|
||||||
|
|
||||||
|
```python
|
||||||
|
import logging
|
||||||
|
|
||||||
|
logging.basicConfig(
|
||||||
|
level=logging.INFO,
|
||||||
|
format='%(asctime)s - %(levelname)s:%(name)s:%(message)s'
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Health Monitoring
|
||||||
|
|
||||||
|
1. **API Health**: Monitor API availability
|
||||||
|
2. **Display Health**: Monitor display functionality
|
||||||
|
3. **Cache Health**: Monitor cache performance
|
||||||
|
4. **System Health**: Monitor system resources
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*This architecture provides a solid foundation for the LEDMatrix system while maintaining flexibility for future enhancements and customizations.*
|
||||||
654
WIKI_CONFIGURATION.md
Normal file
654
WIKI_CONFIGURATION.md
Normal file
@@ -0,0 +1,654 @@
|
|||||||
|
# Configuration Guide
|
||||||
|
|
||||||
|
The LEDMatrix system is configured through JSON files that control every aspect of the display. This guide covers all configuration options and their effects.
|
||||||
|
|
||||||
|
## Configuration Files
|
||||||
|
|
||||||
|
### Main Configuration (`config/config.json`)
|
||||||
|
Contains all non-sensitive settings for the system.
|
||||||
|
|
||||||
|
### Secrets Configuration (`config/config_secrets.json`)
|
||||||
|
Contains API keys and sensitive credentials.
|
||||||
|
|
||||||
|
## System Configuration
|
||||||
|
|
||||||
|
### Display Hardware Settings
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"display": {
|
||||||
|
"hardware": {
|
||||||
|
"rows": 32,
|
||||||
|
"cols": 64,
|
||||||
|
"chain_length": 2,
|
||||||
|
"parallel": 1,
|
||||||
|
"brightness": 95,
|
||||||
|
"hardware_mapping": "adafruit-hat-pwm",
|
||||||
|
"scan_mode": 0,
|
||||||
|
"pwm_bits": 9,
|
||||||
|
"pwm_dither_bits": 1,
|
||||||
|
"pwm_lsb_nanoseconds": 130,
|
||||||
|
"disable_hardware_pulsing": false,
|
||||||
|
"inverse_colors": false,
|
||||||
|
"show_refresh_rate": false,
|
||||||
|
"limit_refresh_rate_hz": 120
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"gpio_slowdown": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Hardware Settings Explained**:
|
||||||
|
- **`rows`/`cols`**: Physical LED matrix dimensions (32x64 for 2 panels)
|
||||||
|
- **`chain_length`**: Number of LED panels connected (2 for 128x32 total)
|
||||||
|
- **`parallel`**: Number of parallel chains (usually 1)
|
||||||
|
- **`brightness`**: Display brightness (0-100)
|
||||||
|
- **`hardware_mapping`**:
|
||||||
|
- `"adafruit-hat-pwm"`: With jumper mod (recommended)
|
||||||
|
- `"adafruit-hat"`: Without jumper mod
|
||||||
|
- **`pwm_bits`**: Color depth (8-11, higher = better colors)
|
||||||
|
- **`gpio_slowdown`**: Timing adjustment (3 for Pi 3, 4 for Pi 4)
|
||||||
|
|
||||||
|
### Display Durations
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"display": {
|
||||||
|
"display_durations": {
|
||||||
|
"clock": 15,
|
||||||
|
"weather": 30,
|
||||||
|
"stocks": 30,
|
||||||
|
"hourly_forecast": 30,
|
||||||
|
"daily_forecast": 30,
|
||||||
|
"stock_news": 20,
|
||||||
|
"odds_ticker": 60,
|
||||||
|
"nhl_live": 30,
|
||||||
|
"nhl_recent": 30,
|
||||||
|
"nhl_upcoming": 30,
|
||||||
|
"nba_live": 30,
|
||||||
|
"nba_recent": 30,
|
||||||
|
"nba_upcoming": 30,
|
||||||
|
"nfl_live": 30,
|
||||||
|
"nfl_recent": 30,
|
||||||
|
"nfl_upcoming": 30,
|
||||||
|
"ncaa_fb_live": 30,
|
||||||
|
"ncaa_fb_recent": 30,
|
||||||
|
"ncaa_fb_upcoming": 30,
|
||||||
|
"ncaa_baseball_live": 30,
|
||||||
|
"ncaa_baseball_recent": 30,
|
||||||
|
"ncaa_baseball_upcoming": 30,
|
||||||
|
"calendar": 30,
|
||||||
|
"youtube": 30,
|
||||||
|
"mlb_live": 30,
|
||||||
|
"mlb_recent": 30,
|
||||||
|
"mlb_upcoming": 30,
|
||||||
|
"milb_live": 30,
|
||||||
|
"milb_recent": 30,
|
||||||
|
"milb_upcoming": 30,
|
||||||
|
"text_display": 10,
|
||||||
|
"soccer_live": 30,
|
||||||
|
"soccer_recent": 30,
|
||||||
|
"soccer_upcoming": 30,
|
||||||
|
"ncaam_basketball_live": 30,
|
||||||
|
"ncaam_basketball_recent": 30,
|
||||||
|
"ncaam_basketball_upcoming": 30,
|
||||||
|
"music": 30,
|
||||||
|
"of_the_day": 40
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Duration Settings**:
|
||||||
|
- Each value controls how long (in seconds) that display mode shows
|
||||||
|
- Higher values = more time for that content
|
||||||
|
- Total rotation time = sum of all enabled durations
|
||||||
|
|
||||||
|
### System Settings
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"web_display_autostart": true,
|
||||||
|
"schedule": {
|
||||||
|
"enabled": true,
|
||||||
|
"start_time": "07:00",
|
||||||
|
"end_time": "23:00"
|
||||||
|
},
|
||||||
|
"timezone": "America/Chicago",
|
||||||
|
"location": {
|
||||||
|
"city": "Dallas",
|
||||||
|
"state": "Texas",
|
||||||
|
"country": "US"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**System Settings Explained**:
|
||||||
|
- **`web_display_autostart`**: Start web interface automatically
|
||||||
|
- **`schedule`**: Control when display is active
|
||||||
|
- **`timezone`**: System timezone for accurate times
|
||||||
|
- **`location`**: Default location for weather and other location-based services
|
||||||
|
|
||||||
|
## Display Manager Configurations
|
||||||
|
|
||||||
|
### Clock Configuration
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"clock": {
|
||||||
|
"enabled": false,
|
||||||
|
"format": "%I:%M %p",
|
||||||
|
"update_interval": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Clock Settings**:
|
||||||
|
- **`enabled`**: Enable/disable clock display
|
||||||
|
- **`format`**: Time format string (Python strftime)
|
||||||
|
- **`update_interval`**: Update frequency in seconds
|
||||||
|
|
||||||
|
**Common Time Formats**:
|
||||||
|
- `"%I:%M %p"` → `12:34 PM`
|
||||||
|
- `"%H:%M"` → `14:34`
|
||||||
|
- `"%I:%M:%S %p"` → `12:34:56 PM`
|
||||||
|
|
||||||
|
### Weather Configuration
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"weather": {
|
||||||
|
"enabled": false,
|
||||||
|
"update_interval": 1800,
|
||||||
|
"units": "imperial",
|
||||||
|
"display_format": "{temp}°F\n{condition}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Weather Settings**:
|
||||||
|
- **`enabled`**: Enable/disable weather display
|
||||||
|
- **`update_interval`**: Update frequency in seconds (1800 = 30 minutes)
|
||||||
|
- **`units`**: `"imperial"` (Fahrenheit) or `"metric"` (Celsius)
|
||||||
|
- **`display_format`**: Custom format string for weather display
|
||||||
|
|
||||||
|
**Weather Display Modes**:
|
||||||
|
- Current weather with icon
|
||||||
|
- Hourly forecast (next 24 hours)
|
||||||
|
- Daily forecast (next 7 days)
|
||||||
|
|
||||||
|
### Stocks Configuration
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"stocks": {
|
||||||
|
"enabled": false,
|
||||||
|
"update_interval": 600,
|
||||||
|
"scroll_speed": 1,
|
||||||
|
"scroll_delay": 0.01,
|
||||||
|
"toggle_chart": false,
|
||||||
|
"symbols": ["ASTS", "SCHD", "INTC", "NVDA", "T", "VOO", "SMCI"]
|
||||||
|
},
|
||||||
|
"crypto": {
|
||||||
|
"enabled": false,
|
||||||
|
"update_interval": 600,
|
||||||
|
"symbols": ["BTC-USD", "ETH-USD"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Stock Settings**:
|
||||||
|
- **`enabled`**: Enable/disable stock display
|
||||||
|
- **`update_interval`**: Update frequency in seconds (600 = 10 minutes)
|
||||||
|
- **`scroll_speed`**: Pixels per scroll update
|
||||||
|
- **`scroll_delay`**: Delay between scroll updates
|
||||||
|
- **`toggle_chart`**: Show/hide mini price charts
|
||||||
|
- **`symbols`**: Array of stock symbols to display
|
||||||
|
|
||||||
|
**Crypto Settings**:
|
||||||
|
- **`enabled`**: Enable/disable crypto display
|
||||||
|
- **`symbols`**: Array of crypto symbols (use `-USD` suffix)
|
||||||
|
|
||||||
|
### Stock News Configuration
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"stock_news": {
|
||||||
|
"enabled": false,
|
||||||
|
"update_interval": 3600,
|
||||||
|
"scroll_speed": 1,
|
||||||
|
"scroll_delay": 0.01,
|
||||||
|
"max_headlines_per_symbol": 1,
|
||||||
|
"headlines_per_rotation": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**News Settings**:
|
||||||
|
- **`enabled`**: Enable/disable news display
|
||||||
|
- **`update_interval`**: Update frequency in seconds
|
||||||
|
- **`max_headlines_per_symbol`**: Max headlines per stock
|
||||||
|
- **`headlines_per_rotation`**: Headlines shown per rotation
|
||||||
|
|
||||||
|
### Music Configuration
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"music": {
|
||||||
|
"enabled": true,
|
||||||
|
"preferred_source": "ytm",
|
||||||
|
"YTM_COMPANION_URL": "http://192.168.86.12:9863",
|
||||||
|
"POLLING_INTERVAL_SECONDS": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Music Settings**:
|
||||||
|
- **`enabled`**: Enable/disable music display
|
||||||
|
- **`preferred_source`**: `"spotify"` or `"ytm"`
|
||||||
|
- **`YTM_COMPANION_URL`**: YouTube Music companion server URL
|
||||||
|
- **`POLLING_INTERVAL_SECONDS`**: How often to check for updates
|
||||||
|
|
||||||
|
### Calendar Configuration
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"calendar": {
|
||||||
|
"enabled": false,
|
||||||
|
"credentials_file": "credentials.json",
|
||||||
|
"token_file": "token.pickle",
|
||||||
|
"update_interval": 3600,
|
||||||
|
"max_events": 3,
|
||||||
|
"calendars": ["birthdays"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Calendar Settings**:
|
||||||
|
- **`enabled`**: Enable/disable calendar display
|
||||||
|
- **`credentials_file`**: Google API credentials file
|
||||||
|
- **`token_file`**: Authentication token file
|
||||||
|
- **`update_interval`**: Update frequency in seconds
|
||||||
|
- **`max_events`**: Maximum events to display
|
||||||
|
- **`calendars`**: Array of calendar IDs to monitor
|
||||||
|
|
||||||
|
## Sports Configurations
|
||||||
|
|
||||||
|
### Common Sports Settings
|
||||||
|
|
||||||
|
All sports managers share these common settings:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"nhl_scoreboard": {
|
||||||
|
"enabled": false,
|
||||||
|
"live_priority": true,
|
||||||
|
"live_game_duration": 20,
|
||||||
|
"show_odds": true,
|
||||||
|
"test_mode": false,
|
||||||
|
"update_interval_seconds": 3600,
|
||||||
|
"live_update_interval": 30,
|
||||||
|
"recent_update_interval": 3600,
|
||||||
|
"upcoming_update_interval": 3600,
|
||||||
|
"show_favorite_teams_only": true,
|
||||||
|
"favorite_teams": ["TB"],
|
||||||
|
"logo_dir": "assets/sports/nhl_logos",
|
||||||
|
"show_records": true,
|
||||||
|
"display_modes": {
|
||||||
|
"nhl_live": true,
|
||||||
|
"nhl_recent": true,
|
||||||
|
"nhl_upcoming": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Common Sports Settings**:
|
||||||
|
- **`enabled`**: Enable/disable this sport
|
||||||
|
- **`live_priority`**: Give live games priority over other content
|
||||||
|
- **`live_game_duration`**: How long to show live games
|
||||||
|
- **`show_odds`**: Display betting odds (where available)
|
||||||
|
- **`test_mode`**: Use test data instead of live API
|
||||||
|
- **`update_interval_seconds`**: How often to fetch new data
|
||||||
|
- **`live_update_interval`**: How often to update live games
|
||||||
|
- **`show_favorite_teams_only`**: Only show games for favorite teams
|
||||||
|
- **`favorite_teams`**: Array of team abbreviations
|
||||||
|
- **`logo_dir`**: Directory containing team logos
|
||||||
|
- **`show_records`**: Display team win/loss records
|
||||||
|
- **`display_modes`**: Enable/disable specific display modes
|
||||||
|
|
||||||
|
### Football-Specific Settings
|
||||||
|
|
||||||
|
NFL and NCAA Football use game-based fetching:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"nfl_scoreboard": {
|
||||||
|
"enabled": false,
|
||||||
|
"recent_games_to_show": 0,
|
||||||
|
"upcoming_games_to_show": 2,
|
||||||
|
"favorite_teams": ["TB", "DAL"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Football Settings**:
|
||||||
|
- **`recent_games_to_show`**: Number of recent games to display
|
||||||
|
- **`upcoming_games_to_show`**: Number of upcoming games to display
|
||||||
|
|
||||||
|
### Soccer Configuration
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"soccer_scoreboard": {
|
||||||
|
"enabled": false,
|
||||||
|
"recent_game_hours": 168,
|
||||||
|
"favorite_teams": ["LIV"],
|
||||||
|
"leagues": ["eng.1", "esp.1", "ger.1", "ita.1", "fra.1", "uefa.champions", "usa.1"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Soccer Settings**:
|
||||||
|
- **`recent_game_hours`**: Hours back to show recent games
|
||||||
|
- **`leagues`**: Array of league codes to monitor
|
||||||
|
|
||||||
|
## Odds Ticker Configuration
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"odds_ticker": {
|
||||||
|
"enabled": false,
|
||||||
|
"show_favorite_teams_only": true,
|
||||||
|
"games_per_favorite_team": 1,
|
||||||
|
"max_games_per_league": 5,
|
||||||
|
"show_odds_only": false,
|
||||||
|
"sort_order": "soonest",
|
||||||
|
"enabled_leagues": ["nfl", "mlb", "ncaa_fb", "milb"],
|
||||||
|
"update_interval": 3600,
|
||||||
|
"scroll_speed": 1,
|
||||||
|
"scroll_delay": 0.01,
|
||||||
|
"loop": true,
|
||||||
|
"future_fetch_days": 50,
|
||||||
|
"show_channel_logos": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Odds Ticker Settings**:
|
||||||
|
- **`enabled`**: Enable/disable odds ticker
|
||||||
|
- **`show_favorite_teams_only`**: Only show odds for favorite teams
|
||||||
|
- **`games_per_favorite_team`**: Games per team to show
|
||||||
|
- **`max_games_per_league`**: Maximum games per league
|
||||||
|
- **`enabled_leagues`**: Leagues to include in ticker
|
||||||
|
- **`sort_order`**: `"soonest"` or `"latest"`
|
||||||
|
- **`future_fetch_days`**: Days ahead to fetch games
|
||||||
|
- **`show_channel_logos`**: Display broadcast network logos
|
||||||
|
|
||||||
|
## Custom Display Configurations
|
||||||
|
|
||||||
|
### Text Display
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"text_display": {
|
||||||
|
"enabled": false,
|
||||||
|
"text": "Subscribe to ChuckBuilds",
|
||||||
|
"font_path": "assets/fonts/press-start-2p.ttf",
|
||||||
|
"font_size": 8,
|
||||||
|
"scroll": true,
|
||||||
|
"scroll_speed": 40,
|
||||||
|
"text_color": [255, 0, 0],
|
||||||
|
"background_color": [0, 0, 0],
|
||||||
|
"scroll_gap_width": 32
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Text Display Settings**:
|
||||||
|
- **`enabled`**: Enable/disable text display
|
||||||
|
- **`text`**: Text to display
|
||||||
|
- **`font_path`**: Path to TTF font file
|
||||||
|
- **`font_size`**: Font size in pixels
|
||||||
|
- **`scroll`**: Enable/disable scrolling
|
||||||
|
- **`scroll_speed`**: Scroll speed in pixels
|
||||||
|
- **`text_color`**: RGB color for text
|
||||||
|
- **`background_color`**: RGB color for background
|
||||||
|
- **`scroll_gap_width`**: Gap between text repetitions
|
||||||
|
|
||||||
|
### YouTube Display
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"youtube": {
|
||||||
|
"enabled": false,
|
||||||
|
"update_interval": 3600
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**YouTube Settings**:
|
||||||
|
- **`enabled`**: Enable/disable YouTube stats
|
||||||
|
- **`update_interval`**: Update frequency in seconds
|
||||||
|
|
||||||
|
### Of The Day Display
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"of_the_day": {
|
||||||
|
"enabled": true,
|
||||||
|
"display_rotate_interval": 20,
|
||||||
|
"update_interval": 3600,
|
||||||
|
"subtitle_rotate_interval": 10,
|
||||||
|
"category_order": ["word_of_the_day", "slovenian_word_of_the_day", "bible_verse_of_the_day"],
|
||||||
|
"categories": {
|
||||||
|
"word_of_the_day": {
|
||||||
|
"enabled": true,
|
||||||
|
"data_file": "of_the_day/word_of_the_day.json",
|
||||||
|
"display_name": "Word of the Day"
|
||||||
|
},
|
||||||
|
"slovenian_word_of_the_day": {
|
||||||
|
"enabled": true,
|
||||||
|
"data_file": "of_the_day/slovenian_word_of_the_day.json",
|
||||||
|
"display_name": "Slovenian Word of the Day"
|
||||||
|
},
|
||||||
|
"bible_verse_of_the_day": {
|
||||||
|
"enabled": true,
|
||||||
|
"data_file": "of_the_day/bible_verse_of_the_day.json",
|
||||||
|
"display_name": "Bible Verse of the Day"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Of The Day Settings**:
|
||||||
|
- **`enabled`**: Enable/disable of the day display
|
||||||
|
- **`display_rotate_interval`**: How long to show each category
|
||||||
|
- **`update_interval`**: Update frequency in seconds
|
||||||
|
- **`subtitle_rotate_interval`**: How long to show subtitles
|
||||||
|
- **`category_order`**: Order of categories to display
|
||||||
|
- **`categories`**: Configuration for each category
|
||||||
|
|
||||||
|
## API Configuration (config_secrets.json)
|
||||||
|
|
||||||
|
### Weather API
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"weather": {
|
||||||
|
"api_key": "your_openweathermap_api_key"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### YouTube API
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"youtube": {
|
||||||
|
"api_key": "your_youtube_api_key",
|
||||||
|
"channel_id": "your_channel_id"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Music APIs
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"music": {
|
||||||
|
"SPOTIFY_CLIENT_ID": "your_spotify_client_id",
|
||||||
|
"SPOTIFY_CLIENT_SECRET": "your_spotify_client_secret",
|
||||||
|
"SPOTIFY_REDIRECT_URI": "http://127.0.0.1:8888/callback"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration Best Practices
|
||||||
|
|
||||||
|
### Performance Optimization
|
||||||
|
|
||||||
|
1. **Update Intervals**: Balance between fresh data and API limits
|
||||||
|
- Weather: 1800 seconds (30 minutes)
|
||||||
|
- Stocks: 600 seconds (10 minutes)
|
||||||
|
- Sports: 3600 seconds (1 hour)
|
||||||
|
- Music: 1 second (real-time)
|
||||||
|
|
||||||
|
2. **Display Durations**: Balance content visibility
|
||||||
|
- Live sports: 20-30 seconds
|
||||||
|
- Weather: 30 seconds
|
||||||
|
- Stocks: 30-60 seconds
|
||||||
|
- Clock: 15 seconds
|
||||||
|
|
||||||
|
3. **Favorite Teams**: Reduce API calls by focusing on specific teams
|
||||||
|
|
||||||
|
### Caching Strategy
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"cache_settings": {
|
||||||
|
"persistent_cache": true,
|
||||||
|
"cache_directory": "/var/cache/ledmatrix",
|
||||||
|
"fallback_cache": "/tmp/ledmatrix_cache"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Error Handling
|
||||||
|
|
||||||
|
- Failed API calls use cached data
|
||||||
|
- Network timeouts are handled gracefully
|
||||||
|
- Invalid data is filtered out
|
||||||
|
- Logging provides debugging information
|
||||||
|
|
||||||
|
## Configuration Validation
|
||||||
|
|
||||||
|
### Required Settings
|
||||||
|
|
||||||
|
1. **Hardware Configuration**: Must match your physical setup
|
||||||
|
2. **API Keys**: Required for enabled services
|
||||||
|
3. **Location**: Required for weather and timezone
|
||||||
|
4. **Team Abbreviations**: Must match official team codes
|
||||||
|
|
||||||
|
### Optional Settings
|
||||||
|
|
||||||
|
1. **Display Durations**: Defaults provided if missing
|
||||||
|
2. **Update Intervals**: Defaults provided if missing
|
||||||
|
3. **Favorite Teams**: Can be empty for all teams
|
||||||
|
4. **Custom Text**: Can be any string
|
||||||
|
|
||||||
|
## Configuration Examples
|
||||||
|
|
||||||
|
### Minimal Configuration
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"display": {
|
||||||
|
"hardware": {
|
||||||
|
"rows": 32,
|
||||||
|
"cols": 64,
|
||||||
|
"chain_length": 2,
|
||||||
|
"brightness": 90,
|
||||||
|
"hardware_mapping": "adafruit-hat-pwm"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"clock": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Full Sports Configuration
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"nhl_scoreboard": {
|
||||||
|
"enabled": true,
|
||||||
|
"favorite_teams": ["TB", "DAL"],
|
||||||
|
"show_favorite_teams_only": true
|
||||||
|
},
|
||||||
|
"nba_scoreboard": {
|
||||||
|
"enabled": true,
|
||||||
|
"favorite_teams": ["DAL"],
|
||||||
|
"show_favorite_teams_only": true
|
||||||
|
},
|
||||||
|
"nfl_scoreboard": {
|
||||||
|
"enabled": true,
|
||||||
|
"favorite_teams": ["TB", "DAL"],
|
||||||
|
"show_favorite_teams_only": true
|
||||||
|
},
|
||||||
|
"odds_ticker": {
|
||||||
|
"enabled": true,
|
||||||
|
"enabled_leagues": ["nfl", "nba", "mlb"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Financial Focus Configuration
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"stocks": {
|
||||||
|
"enabled": true,
|
||||||
|
"symbols": ["AAPL", "MSFT", "GOOGL", "TSLA", "NVDA"],
|
||||||
|
"update_interval": 300
|
||||||
|
},
|
||||||
|
"crypto": {
|
||||||
|
"enabled": true,
|
||||||
|
"symbols": ["BTC-USD", "ETH-USD", "ADA-USD"]
|
||||||
|
},
|
||||||
|
"stock_news": {
|
||||||
|
"enabled": true,
|
||||||
|
"update_interval": 1800
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting Configuration
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
1. **No Display**: Check hardware configuration
|
||||||
|
2. **No Data**: Verify API keys and network
|
||||||
|
3. **Wrong Times**: Check timezone setting
|
||||||
|
4. **Performance Issues**: Reduce update frequencies
|
||||||
|
|
||||||
|
### Validation Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Validate JSON syntax
|
||||||
|
python3 -m json.tool config/config.json
|
||||||
|
|
||||||
|
# Check configuration loading
|
||||||
|
python3 -c "from src.config_manager import ConfigManager; c = ConfigManager(); print('Config valid')"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*For detailed information about specific display managers, see the [Display Managers](WIKI_DISPLAY_MANAGERS.md) page.*
|
||||||
501
WIKI_DISPLAY_MANAGERS.md
Normal file
501
WIKI_DISPLAY_MANAGERS.md
Normal file
@@ -0,0 +1,501 @@
|
|||||||
|
# Display Managers Guide
|
||||||
|
|
||||||
|
The LEDMatrix system uses a modular architecture where each feature is implemented as a separate "Display Manager". This guide covers all available display managers and their configuration options.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Each display manager is responsible for:
|
||||||
|
1. **Data Fetching**: Retrieving data from APIs or local sources
|
||||||
|
2. **Data Processing**: Transforming raw data into displayable format
|
||||||
|
3. **Display Rendering**: Creating visual content for the LED matrix
|
||||||
|
4. **Caching**: Storing data to reduce API calls
|
||||||
|
5. **Configuration**: Managing settings and preferences
|
||||||
|
|
||||||
|
## Core Display Managers
|
||||||
|
|
||||||
|
### 🕐 Clock Manager (`src/clock.py`)
|
||||||
|
**Purpose**: Displays current time in various formats
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"clock": {
|
||||||
|
"enabled": true,
|
||||||
|
"format": "%I:%M %p",
|
||||||
|
"update_interval": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Real-time clock display
|
||||||
|
- Configurable time format
|
||||||
|
- Automatic timezone handling
|
||||||
|
- Minimal resource usage
|
||||||
|
|
||||||
|
**Display Format**: `12:34 PM`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🌤️ Weather Manager (`src/weather_manager.py`)
|
||||||
|
**Purpose**: Displays current weather, hourly forecasts, and daily forecasts
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"weather": {
|
||||||
|
"enabled": true,
|
||||||
|
"update_interval": 1800,
|
||||||
|
"units": "imperial",
|
||||||
|
"display_format": "{temp}°F\n{condition}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Current weather conditions
|
||||||
|
- Hourly forecast (next 24 hours)
|
||||||
|
- Daily forecast (next 7 days)
|
||||||
|
- Weather icons and animations
|
||||||
|
- UV index display
|
||||||
|
- Wind speed and direction
|
||||||
|
- Humidity and pressure data
|
||||||
|
|
||||||
|
**Display Modes**:
|
||||||
|
- Current weather with icon
|
||||||
|
- Hourly forecast with temperature trend
|
||||||
|
- Daily forecast with high/low temps
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 💰 Stock Manager (`src/stock_manager.py`)
|
||||||
|
**Purpose**: Displays stock prices, crypto prices, and financial data
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"stocks": {
|
||||||
|
"enabled": true,
|
||||||
|
"update_interval": 600,
|
||||||
|
"scroll_speed": 1,
|
||||||
|
"scroll_delay": 0.01,
|
||||||
|
"toggle_chart": false,
|
||||||
|
"symbols": ["AAPL", "MSFT", "GOOGL", "TSLA"]
|
||||||
|
},
|
||||||
|
"crypto": {
|
||||||
|
"enabled": true,
|
||||||
|
"update_interval": 600,
|
||||||
|
"symbols": ["BTC-USD", "ETH-USD"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Real-time stock prices
|
||||||
|
- Cryptocurrency prices
|
||||||
|
- Price change indicators (green/red)
|
||||||
|
- Percentage change display
|
||||||
|
- Optional mini charts
|
||||||
|
- Scrolling ticker format
|
||||||
|
- Company/crypto logos
|
||||||
|
|
||||||
|
**Data Sources**:
|
||||||
|
- Yahoo Finance API for stocks
|
||||||
|
- Yahoo Finance API for crypto
|
||||||
|
- Automatic market hours detection
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📰 Stock News Manager (`src/stock_news_manager.py`)
|
||||||
|
**Purpose**: Displays financial news headlines for configured stocks
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"stock_news": {
|
||||||
|
"enabled": true,
|
||||||
|
"update_interval": 3600,
|
||||||
|
"scroll_speed": 1,
|
||||||
|
"scroll_delay": 0.01,
|
||||||
|
"max_headlines_per_symbol": 1,
|
||||||
|
"headlines_per_rotation": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Financial news headlines
|
||||||
|
- Stock-specific news filtering
|
||||||
|
- Scrolling text display
|
||||||
|
- Configurable headline limits
|
||||||
|
- Automatic rotation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🎵 Music Manager (`src/music_manager.py`)
|
||||||
|
**Purpose**: Displays currently playing music from Spotify or YouTube Music
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"music": {
|
||||||
|
"enabled": true,
|
||||||
|
"preferred_source": "ytm",
|
||||||
|
"YTM_COMPANION_URL": "http://192.168.86.12:9863",
|
||||||
|
"POLLING_INTERVAL_SECONDS": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Spotify integration
|
||||||
|
- YouTube Music integration
|
||||||
|
- Album art display
|
||||||
|
- Song title and artist
|
||||||
|
- Playback status
|
||||||
|
- Real-time updates
|
||||||
|
|
||||||
|
**Supported Sources**:
|
||||||
|
- Spotify (requires API credentials)
|
||||||
|
- YouTube Music (requires YTMD companion server)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📅 Calendar Manager (`src/calendar_manager.py`)
|
||||||
|
**Purpose**: Displays upcoming Google Calendar events
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"calendar": {
|
||||||
|
"enabled": true,
|
||||||
|
"credentials_file": "credentials.json",
|
||||||
|
"token_file": "token.pickle",
|
||||||
|
"update_interval": 3600,
|
||||||
|
"max_events": 3,
|
||||||
|
"calendars": ["birthdays"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Google Calendar integration
|
||||||
|
- Event date and time display
|
||||||
|
- Event title (wrapped to fit display)
|
||||||
|
- Multiple calendar support
|
||||||
|
- Configurable event limits
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🏈 Sports Managers
|
||||||
|
|
||||||
|
The system includes separate managers for each sports league:
|
||||||
|
|
||||||
|
#### NHL Managers (`src/nhl_managers.py`)
|
||||||
|
- **NHLLiveManager**: Currently playing games
|
||||||
|
- **NHLRecentManager**: Completed games (last 48 hours)
|
||||||
|
- **NHLUpcomingManager**: Scheduled games
|
||||||
|
|
||||||
|
#### NBA Managers (`src/nba_managers.py`)
|
||||||
|
- **NBALiveManager**: Currently playing games
|
||||||
|
- **NBARecentManager**: Completed games
|
||||||
|
- **NBAUpcomingManager**: Scheduled games
|
||||||
|
|
||||||
|
#### MLB Managers (`src/mlb_manager.py`)
|
||||||
|
- **MLBLiveManager**: Currently playing games
|
||||||
|
- **MLBRecentManager**: Completed games
|
||||||
|
- **MLBUpcomingManager**: Scheduled games
|
||||||
|
|
||||||
|
#### NFL Managers (`src/nfl_managers.py`)
|
||||||
|
- **NFLLiveManager**: Currently playing games
|
||||||
|
- **NFLRecentManager**: Completed games
|
||||||
|
- **NFLUpcomingManager**: Scheduled games
|
||||||
|
|
||||||
|
#### NCAA Managers
|
||||||
|
- **NCAA Football** (`src/ncaa_fb_managers.py`)
|
||||||
|
- **NCAA Baseball** (`src/ncaa_baseball_managers.py`)
|
||||||
|
- **NCAA Basketball** (`src/ncaam_basketball_managers.py`)
|
||||||
|
|
||||||
|
#### Soccer Managers (`src/soccer_managers.py`)
|
||||||
|
- **SoccerLiveManager**: Currently playing games
|
||||||
|
- **SoccerRecentManager**: Completed games
|
||||||
|
- **SoccerUpcomingManager**: Scheduled games
|
||||||
|
|
||||||
|
#### MiLB Managers (`src/milb_manager.py`)
|
||||||
|
- **MiLBLiveManager**: Currently playing games
|
||||||
|
- **MiLBRecentManager**: Completed games
|
||||||
|
- **MiLBUpcomingManager**: Scheduled games
|
||||||
|
|
||||||
|
**Common Sports Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"nhl_scoreboard": {
|
||||||
|
"enabled": true,
|
||||||
|
"live_priority": true,
|
||||||
|
"live_game_duration": 20,
|
||||||
|
"show_odds": true,
|
||||||
|
"test_mode": false,
|
||||||
|
"update_interval_seconds": 3600,
|
||||||
|
"live_update_interval": 30,
|
||||||
|
"show_favorite_teams_only": true,
|
||||||
|
"favorite_teams": ["TB"],
|
||||||
|
"logo_dir": "assets/sports/nhl_logos",
|
||||||
|
"show_records": true,
|
||||||
|
"display_modes": {
|
||||||
|
"nhl_live": true,
|
||||||
|
"nhl_recent": true,
|
||||||
|
"nhl_upcoming": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Sports Features**:
|
||||||
|
- Live game scores and status
|
||||||
|
- Team logos and records
|
||||||
|
- Game times and venues
|
||||||
|
- Odds integration (where available)
|
||||||
|
- Favorite team filtering
|
||||||
|
- Automatic game switching
|
||||||
|
- ESPN API integration
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🎲 Odds Ticker Manager (`src/odds_ticker_manager.py`)
|
||||||
|
**Purpose**: Displays betting odds for upcoming sports games
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"odds_ticker": {
|
||||||
|
"enabled": true,
|
||||||
|
"show_favorite_teams_only": true,
|
||||||
|
"games_per_favorite_team": 1,
|
||||||
|
"max_games_per_league": 5,
|
||||||
|
"show_odds_only": false,
|
||||||
|
"sort_order": "soonest",
|
||||||
|
"enabled_leagues": ["nfl", "mlb", "ncaa_fb", "milb"],
|
||||||
|
"update_interval": 3600,
|
||||||
|
"scroll_speed": 1,
|
||||||
|
"scroll_delay": 0.01,
|
||||||
|
"loop": true,
|
||||||
|
"future_fetch_days": 50,
|
||||||
|
"show_channel_logos": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Multi-league support (NFL, NBA, MLB, NCAA)
|
||||||
|
- Spread, money line, and over/under odds
|
||||||
|
- Team logos display
|
||||||
|
- Scrolling text format
|
||||||
|
- Game time display
|
||||||
|
- ESPN API integration
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🎨 Custom Display Managers
|
||||||
|
|
||||||
|
#### Text Display Manager (`src/text_display.py`)
|
||||||
|
**Purpose**: Displays custom text messages
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"text_display": {
|
||||||
|
"enabled": true,
|
||||||
|
"text": "Subscribe to ChuckBuilds",
|
||||||
|
"font_path": "assets/fonts/press-start-2p.ttf",
|
||||||
|
"font_size": 8,
|
||||||
|
"scroll": true,
|
||||||
|
"scroll_speed": 40,
|
||||||
|
"text_color": [255, 0, 0],
|
||||||
|
"background_color": [0, 0, 0],
|
||||||
|
"scroll_gap_width": 32
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Custom text messages
|
||||||
|
- Configurable fonts and colors
|
||||||
|
- Scrolling text support
|
||||||
|
- Static text display
|
||||||
|
- Background color options
|
||||||
|
|
||||||
|
#### YouTube Display Manager (`src/youtube_display.py`)
|
||||||
|
**Purpose**: Displays YouTube channel statistics
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"youtube": {
|
||||||
|
"enabled": true,
|
||||||
|
"update_interval": 3600
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Subscriber count display
|
||||||
|
- Video count display
|
||||||
|
- View count display
|
||||||
|
- YouTube API integration
|
||||||
|
|
||||||
|
#### Of The Day Manager (`src/of_the_day_manager.py`)
|
||||||
|
**Purpose**: Displays various "of the day" content
|
||||||
|
|
||||||
|
**Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"of_the_day": {
|
||||||
|
"enabled": true,
|
||||||
|
"display_rotate_interval": 20,
|
||||||
|
"update_interval": 3600,
|
||||||
|
"subtitle_rotate_interval": 10,
|
||||||
|
"category_order": ["word_of_the_day", "slovenian_word_of_the_day", "bible_verse_of_the_day"],
|
||||||
|
"categories": {
|
||||||
|
"word_of_the_day": {
|
||||||
|
"enabled": true,
|
||||||
|
"data_file": "of_the_day/word_of_the_day.json",
|
||||||
|
"display_name": "Word of the Day"
|
||||||
|
},
|
||||||
|
"slovenian_word_of_the_day": {
|
||||||
|
"enabled": true,
|
||||||
|
"data_file": "of_the_day/slovenian_word_of_the_day.json",
|
||||||
|
"display_name": "Slovenian Word of the Day"
|
||||||
|
},
|
||||||
|
"bible_verse_of_the_day": {
|
||||||
|
"enabled": true,
|
||||||
|
"data_file": "of_the_day/bible_verse_of_the_day.json",
|
||||||
|
"display_name": "Bible Verse of the Day"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Word of the day
|
||||||
|
- Slovenian word of the day
|
||||||
|
- Bible verse of the day
|
||||||
|
- Rotating display categories
|
||||||
|
- Local JSON data files
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Display Manager Architecture
|
||||||
|
|
||||||
|
### Common Interface
|
||||||
|
All display managers follow a consistent interface:
|
||||||
|
|
||||||
|
```python
|
||||||
|
class DisplayManager:
|
||||||
|
def __init__(self, config, display_manager):
|
||||||
|
# Initialize with configuration and display manager
|
||||||
|
|
||||||
|
def update_data(self):
|
||||||
|
# Fetch and process new data
|
||||||
|
|
||||||
|
def display(self, force_clear=False):
|
||||||
|
# Render content to the display
|
||||||
|
|
||||||
|
def is_enabled(self):
|
||||||
|
# Check if manager is enabled
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Flow
|
||||||
|
1. **Configuration**: Manager reads settings from `config.json`
|
||||||
|
2. **Data Fetching**: Retrieves data from APIs or local sources
|
||||||
|
3. **Caching**: Stores data using `CacheManager`
|
||||||
|
4. **Processing**: Transforms data into display format
|
||||||
|
5. **Rendering**: Uses `DisplayManager` to show content
|
||||||
|
6. **Rotation**: Returns to main display controller
|
||||||
|
|
||||||
|
### Error Handling
|
||||||
|
- API failures fall back to cached data
|
||||||
|
- Network timeouts are handled gracefully
|
||||||
|
- Invalid data is filtered out
|
||||||
|
- Logging provides debugging information
|
||||||
|
|
||||||
|
## Configuration Best Practices
|
||||||
|
|
||||||
|
### Enable/Disable Managers
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"weather": {
|
||||||
|
"enabled": true // Set to false to disable
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Set Display Durations
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"display": {
|
||||||
|
"display_durations": {
|
||||||
|
"weather": 30, // 30 seconds
|
||||||
|
"stocks": 60, // 1 minute
|
||||||
|
"nhl_live": 20 // 20 seconds
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configure Update Intervals
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"weather": {
|
||||||
|
"update_interval": 1800 // Update every 30 minutes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Set Favorite Teams
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"nhl_scoreboard": {
|
||||||
|
"show_favorite_teams_only": true,
|
||||||
|
"favorite_teams": ["TB", "DAL"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance Considerations
|
||||||
|
|
||||||
|
### API Rate Limits
|
||||||
|
- Weather: 1000 calls/day (OpenWeatherMap)
|
||||||
|
- Stocks: 2000 calls/hour (Yahoo Finance)
|
||||||
|
- Sports: ESPN API (no documented limits)
|
||||||
|
- Music: Spotify/YouTube Music APIs
|
||||||
|
|
||||||
|
### Caching Strategy
|
||||||
|
- Data cached based on `update_interval`
|
||||||
|
- Cache persists across restarts
|
||||||
|
- Failed API calls use cached data
|
||||||
|
- Automatic cache invalidation
|
||||||
|
|
||||||
|
### Resource Usage
|
||||||
|
- Each manager runs independently
|
||||||
|
- Disabled managers use no resources
|
||||||
|
- Memory usage scales with enabled features
|
||||||
|
- CPU usage minimal during idle periods
|
||||||
|
|
||||||
|
## Troubleshooting Display Managers
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
1. **No Data Displayed**: Check API keys and network connectivity
|
||||||
|
2. **Outdated Data**: Verify update intervals and cache settings
|
||||||
|
3. **Display Errors**: Check font files and display configuration
|
||||||
|
4. **Performance Issues**: Reduce update frequency or disable unused managers
|
||||||
|
|
||||||
|
### Debugging
|
||||||
|
- Enable logging for specific managers
|
||||||
|
- Check cache directory for data files
|
||||||
|
- Verify API credentials in `config_secrets.json`
|
||||||
|
- Test individual managers in isolation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*For detailed technical information about each display manager, see the [Display Manager Details](WIKI_DISPLAY_MANAGER_DETAILS.md) page.*
|
||||||
115
WIKI_HOME.md
Normal file
115
WIKI_HOME.md
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
# LEDMatrix Wiki
|
||||||
|
|
||||||
|
Welcome to the LEDMatrix Wiki! This comprehensive documentation will help you understand, configure, and customize your LED matrix display system.
|
||||||
|
|
||||||
|
## 🏠 [Home](WIKI_HOME.md) - You are here
|
||||||
|
The main wiki page with overview and navigation.
|
||||||
|
|
||||||
|
## 📋 [Quick Start Guide](WIKI_QUICK_START.md)
|
||||||
|
Get your LEDMatrix up and running in minutes with this step-by-step guide.
|
||||||
|
|
||||||
|
## 🏗️ [System Architecture](WIKI_ARCHITECTURE.md)
|
||||||
|
Understand how the LEDMatrix system is organized and how all components work together.
|
||||||
|
|
||||||
|
## ⚙️ [Configuration Guide](WIKI_CONFIGURATION.md)
|
||||||
|
Complete guide to configuring all aspects of your LEDMatrix system.
|
||||||
|
|
||||||
|
## 🎯 [Display Managers](WIKI_DISPLAY_MANAGERS.md)
|
||||||
|
Detailed documentation for each display manager and their configuration options.
|
||||||
|
|
||||||
|
## 🎨 [Display Manager Details](WIKI_DISPLAY_MANAGER_DETAILS.md)
|
||||||
|
In-depth technical details about each display manager's functionality and API integration.
|
||||||
|
|
||||||
|
## 🔧 [Hardware Setup](WIKI_HARDWARE.md)
|
||||||
|
Complete hardware requirements, assembly instructions, and troubleshooting.
|
||||||
|
|
||||||
|
## 🐧 [Raspberry Pi Setup](WIKI_RASPBERRY_PI.md)
|
||||||
|
Step-by-step instructions for setting up your Raspberry Pi for LEDMatrix.
|
||||||
|
|
||||||
|
## 🚀 [Installation & Deployment](WIKI_INSTALLATION.md)
|
||||||
|
Complete installation process, service setup, and deployment options.
|
||||||
|
|
||||||
|
## 🔐 [API Authentication](WIKI_API_AUTH.md)
|
||||||
|
How to set up API keys and authentication for all supported services.
|
||||||
|
|
||||||
|
## 🎵 [Music Integration](WIKI_MUSIC.md)
|
||||||
|
Complete guide to Spotify and YouTube Music integration.
|
||||||
|
|
||||||
|
## 🏈 [Sports Integration](WIKI_SPORTS.md)
|
||||||
|
Detailed documentation for all sports leagues and their configuration.
|
||||||
|
|
||||||
|
## 💰 [Financial Data](WIKI_FINANCIAL.md)
|
||||||
|
Stock ticker, crypto, and financial news display configuration.
|
||||||
|
|
||||||
|
## 🌤️ [Weather Display](WIKI_WEATHER.md)
|
||||||
|
Weather current conditions, forecasts, and icon system.
|
||||||
|
|
||||||
|
## 📅 [Calendar Integration](WIKI_CALENDAR.md)
|
||||||
|
Google Calendar integration and event display.
|
||||||
|
|
||||||
|
## 🎨 [Custom Displays](WIKI_CUSTOM_DISPLAYS.md)
|
||||||
|
Text display, YouTube stats, and custom content creation.
|
||||||
|
|
||||||
|
## 🔧 [Troubleshooting](WIKI_TROUBLESHOOTING.md)
|
||||||
|
Common issues, solutions, and debugging techniques.
|
||||||
|
|
||||||
|
## 🛠️ [Development Guide](WIKI_DEVELOPMENT.md)
|
||||||
|
How to extend the system, add new features, and contribute.
|
||||||
|
|
||||||
|
## 📚 [API Reference](WIKI_API_REFERENCE.md)
|
||||||
|
Technical reference for all classes, methods, and configuration options.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Navigation
|
||||||
|
|
||||||
|
### Core Features
|
||||||
|
- [Display Managers](WIKI_DISPLAY_MANAGERS.md) - All display modules
|
||||||
|
- [Configuration](WIKI_CONFIGURATION.md) - Complete config guide
|
||||||
|
- [Hardware Setup](WIKI_HARDWARE.md) - Physical setup
|
||||||
|
|
||||||
|
### Integrations
|
||||||
|
- [Sports](WIKI_SPORTS.md) - All sports leagues
|
||||||
|
- [Music](WIKI_MUSIC.md) - Spotify & YouTube Music
|
||||||
|
- [Weather](WIKI_WEATHER.md) - Weather display
|
||||||
|
- [Financial](WIKI_FINANCIAL.md) - Stocks & crypto
|
||||||
|
- [Calendar](WIKI_CALENDAR.md) - Google Calendar
|
||||||
|
|
||||||
|
### Technical
|
||||||
|
- [Architecture](WIKI_ARCHITECTURE.md) - System design
|
||||||
|
- [API Reference](WIKI_API_REFERENCE.md) - Technical docs
|
||||||
|
- [Development](WIKI_DEVELOPMENT.md) - Extending the system
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## About LEDMatrix
|
||||||
|
|
||||||
|
LEDMatrix is a comprehensive LED matrix display system that provides real-time information display capabilities for various data sources. The system is highly configurable and supports multiple display modes that can be enabled or disabled based on user preferences.
|
||||||
|
|
||||||
|
### Key Features
|
||||||
|
- **Modular Design**: Each feature is a separate manager that can be enabled/disabled
|
||||||
|
- **Real-time Updates**: Live data from APIs with intelligent caching
|
||||||
|
- **Multiple Sports**: NHL, NBA, MLB, NFL, NCAA, Soccer, and more
|
||||||
|
- **Financial Data**: Stock ticker, crypto prices, and financial news
|
||||||
|
- **Weather**: Current conditions, hourly and daily forecasts
|
||||||
|
- **Music**: Spotify and YouTube Music integration
|
||||||
|
- **Custom Content**: Text display, YouTube stats, and more
|
||||||
|
- **Scheduling**: Configurable display rotation and timing
|
||||||
|
- **Caching**: Intelligent caching to reduce API calls
|
||||||
|
|
||||||
|
### System Requirements
|
||||||
|
- Raspberry Pi 3B+ or 4 (NOT Pi 5)
|
||||||
|
- Adafruit RGB Matrix Bonnet/HAT
|
||||||
|
- 2x LED Matrix panels (64x32)
|
||||||
|
- 5V 4A DC Power Supply
|
||||||
|
- Internet connection for API access
|
||||||
|
|
||||||
|
### Quick Links
|
||||||
|
- [YouTube Setup Video](https://www.youtube.com/watch?v=_HaqfJy1Y54)
|
||||||
|
- [Project Website](https://www.chuck-builds.com/led-matrix/)
|
||||||
|
- [GitHub Repository](https://github.com/ChuckBuilds/LEDMatrix)
|
||||||
|
- [Discord Community](https://discord.com/invite/uW36dVAtcT)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*This wiki is designed to help you get the most out of your LEDMatrix system. Each page contains detailed information, configuration examples, and troubleshooting tips.*
|
||||||
364
WIKI_QUICK_START.md
Normal file
364
WIKI_QUICK_START.md
Normal file
@@ -0,0 +1,364 @@
|
|||||||
|
# Quick Start Guide
|
||||||
|
|
||||||
|
Get your LEDMatrix system up and running in minutes! This guide covers the essential steps to get your display working.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
### Hardware Requirements
|
||||||
|
- Raspberry Pi 3B+ or 4 (NOT Pi 5)
|
||||||
|
- Adafruit RGB Matrix Bonnet/HAT
|
||||||
|
- 2x LED Matrix panels (64x32 each)
|
||||||
|
- 5V 4A DC Power Supply
|
||||||
|
- Micro SD card (8GB or larger)
|
||||||
|
|
||||||
|
### Software Requirements
|
||||||
|
- Internet connection
|
||||||
|
- SSH access to Raspberry Pi
|
||||||
|
- Basic command line knowledge
|
||||||
|
|
||||||
|
## Step 1: Prepare Raspberry Pi
|
||||||
|
|
||||||
|
### 1.1 Create Raspberry Pi Image
|
||||||
|
1. Download [Raspberry Pi Imager](https://www.raspberrypi.com/software/)
|
||||||
|
2. Choose your Raspberry Pi model
|
||||||
|
3. Select "Raspbian OS Lite (64-bit)"
|
||||||
|
4. Choose your micro SD card
|
||||||
|
5. Click "Next" then "Edit Settings"
|
||||||
|
|
||||||
|
### 1.2 Configure OS Settings
|
||||||
|
1. **General Tab**:
|
||||||
|
- Set hostname: `ledpi`
|
||||||
|
- Enable SSH
|
||||||
|
- Set username and password
|
||||||
|
- Configure WiFi
|
||||||
|
|
||||||
|
2. **Services Tab**:
|
||||||
|
- Enable SSH
|
||||||
|
- Use password authentication
|
||||||
|
|
||||||
|
3. Click "Save" and write the image
|
||||||
|
|
||||||
|
### 1.3 Boot and Connect
|
||||||
|
1. Insert SD card into Raspberry Pi
|
||||||
|
2. Power on and wait for boot
|
||||||
|
3. Connect via SSH:
|
||||||
|
```bash
|
||||||
|
ssh ledpi@ledpi
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 2: Install LEDMatrix
|
||||||
|
|
||||||
|
### 2.1 Update System
|
||||||
|
```bash
|
||||||
|
sudo apt update && sudo apt upgrade -y
|
||||||
|
sudo apt install -y git python3-pip cython3 build-essential python3-dev python3-pillow scons
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 Clone Repository
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/ChuckBuilds/LEDMatrix.git
|
||||||
|
cd LEDMatrix
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.3 Install Dependencies
|
||||||
|
```bash
|
||||||
|
sudo pip3 install --break-system-packages -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.4 Install RGB Matrix Library
|
||||||
|
```bash
|
||||||
|
cd rpi-rgb-led-matrix-master
|
||||||
|
sudo make build-python PYTHON=$(which python3)
|
||||||
|
cd bindings/python
|
||||||
|
sudo python3 setup.py install
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.5 Test Installation
|
||||||
|
```bash
|
||||||
|
python3 -c 'from rgbmatrix import RGBMatrix, RGBMatrixOptions; print("Success!")'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 3: Configure Hardware
|
||||||
|
|
||||||
|
### 3.1 Remove Audio Services
|
||||||
|
```bash
|
||||||
|
sudo apt-get remove bluez bluez-firmware pi-bluetooth triggerhappy pigpio
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 Blacklist Sound Module
|
||||||
|
```bash
|
||||||
|
cat <<EOF | sudo tee /etc/modprobe.d/blacklist-rgb-matrix.conf
|
||||||
|
blacklist snd_bcm2835
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sudo update-initramfs -u
|
||||||
|
sudo reboot
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 Optimize Performance
|
||||||
|
```bash
|
||||||
|
# Edit cmdline.txt
|
||||||
|
sudo nano /boot/firmware/cmdline.txt
|
||||||
|
# Add "isolcpus=3" at the end
|
||||||
|
|
||||||
|
# Edit config.txt
|
||||||
|
sudo nano /boot/firmware/config.txt
|
||||||
|
# Change "dtparam=audio=on" to "dtparam=audio=off"
|
||||||
|
|
||||||
|
sudo reboot
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 4: Configure LEDMatrix
|
||||||
|
|
||||||
|
### 4.1 Basic Configuration
|
||||||
|
```bash
|
||||||
|
sudo nano config/config.json
|
||||||
|
```
|
||||||
|
|
||||||
|
**Minimal Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"display": {
|
||||||
|
"hardware": {
|
||||||
|
"rows": 32,
|
||||||
|
"cols": 64,
|
||||||
|
"chain_length": 2,
|
||||||
|
"brightness": 90,
|
||||||
|
"hardware_mapping": "adafruit-hat-pwm"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"clock": {
|
||||||
|
"enabled": true
|
||||||
|
},
|
||||||
|
"weather": {
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 Set Permissions
|
||||||
|
```bash
|
||||||
|
sudo chmod o+x /home/ledpi
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 Setup Cache (Optional)
|
||||||
|
```bash
|
||||||
|
chmod +x setup_cache.sh
|
||||||
|
./setup_cache.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 5: Test Basic Display
|
||||||
|
|
||||||
|
### 5.1 Run Display
|
||||||
|
```bash
|
||||||
|
sudo python3 display_controller.py
|
||||||
|
```
|
||||||
|
|
||||||
|
**Expected Behavior**:
|
||||||
|
- Display should show "Initializing" message
|
||||||
|
- Clock should display current time
|
||||||
|
- Weather should show current conditions (if API key configured)
|
||||||
|
|
||||||
|
### 5.2 Stop Display
|
||||||
|
Press `Ctrl+C` to stop the display
|
||||||
|
|
||||||
|
## Step 6: Configure APIs (Optional)
|
||||||
|
|
||||||
|
### 6.1 Weather API
|
||||||
|
1. Get free API key from [OpenWeatherMap](https://openweathermap.org/api)
|
||||||
|
2. Create secrets file:
|
||||||
|
```bash
|
||||||
|
cp config/config_secrets.template.json config/config_secrets.json
|
||||||
|
sudo nano config/config_secrets.json
|
||||||
|
```
|
||||||
|
3. Add your API key:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"weather": {
|
||||||
|
"api_key": "your_api_key_here"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.2 Test Weather Display
|
||||||
|
```bash
|
||||||
|
sudo python3 display_controller.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 7: Install as Service
|
||||||
|
|
||||||
|
### 7.1 Install Service
|
||||||
|
```bash
|
||||||
|
chmod +x install_service.sh
|
||||||
|
sudo ./install_service.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.2 Control Service
|
||||||
|
```bash
|
||||||
|
# Start display
|
||||||
|
sudo systemctl start ledmatrix.service
|
||||||
|
|
||||||
|
# Stop display
|
||||||
|
sudo systemctl stop ledmatrix.service
|
||||||
|
|
||||||
|
# Check status
|
||||||
|
sudo systemctl status ledmatrix.service
|
||||||
|
|
||||||
|
# Enable autostart
|
||||||
|
sudo systemctl enable ledmatrix.service
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.3 Convenience Scripts
|
||||||
|
```bash
|
||||||
|
chmod +x start_display.sh stop_display.sh
|
||||||
|
|
||||||
|
# Start display
|
||||||
|
sudo ./start_display.sh
|
||||||
|
|
||||||
|
# Stop display
|
||||||
|
sudo ./stop_display.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 8: Add More Features
|
||||||
|
|
||||||
|
### 8.1 Enable Stocks
|
||||||
|
Edit `config/config.json`:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"stocks": {
|
||||||
|
"enabled": true,
|
||||||
|
"symbols": ["AAPL", "MSFT", "GOOGL", "TSLA"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.2 Enable Sports
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"nhl_scoreboard": {
|
||||||
|
"enabled": true,
|
||||||
|
"favorite_teams": ["TB"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.3 Enable Music
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"music": {
|
||||||
|
"enabled": true,
|
||||||
|
"preferred_source": "ytm"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
1. **No Display**:
|
||||||
|
- Check hardware connections
|
||||||
|
- Verify `hardware_mapping` setting
|
||||||
|
- Ensure power supply is adequate
|
||||||
|
|
||||||
|
2. **Permission Errors**:
|
||||||
|
```bash
|
||||||
|
sudo chmod o+x /home/ledpi
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Import Errors**:
|
||||||
|
```bash
|
||||||
|
cd rpi-rgb-led-matrix-master/bindings/python
|
||||||
|
sudo python3 setup.py install
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Cache Issues**:
|
||||||
|
```bash
|
||||||
|
chmod +x fix_cache_permissions.sh
|
||||||
|
./fix_cache_permissions.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test Individual Components
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Test clock
|
||||||
|
python3 -c "from src.clock import Clock; from src.display_manager import DisplayManager; c = Clock(DisplayManager({})); c.display()"
|
||||||
|
|
||||||
|
# Test weather (requires API key)
|
||||||
|
python3 -c "from src.weather_manager import WeatherManager; from src.display_manager import DisplayManager; w = WeatherManager({'weather': {'enabled': True}}, DisplayManager({})); w.display_weather()"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
### 1. Configure Your Preferences
|
||||||
|
- Edit `config/config.json` to enable desired features
|
||||||
|
- Add API keys to `config/config_secrets.json`
|
||||||
|
- Customize display durations and settings
|
||||||
|
|
||||||
|
### 2. Add Sports Teams
|
||||||
|
- Configure favorite teams for each sport
|
||||||
|
- Set up odds ticker for betting information
|
||||||
|
- Customize display modes
|
||||||
|
|
||||||
|
### 3. Set Up Music Integration
|
||||||
|
- Configure Spotify or YouTube Music
|
||||||
|
- Set up authentication
|
||||||
|
- Test music display
|
||||||
|
|
||||||
|
### 4. Customize Display
|
||||||
|
- Add custom text messages
|
||||||
|
- Configure YouTube stats
|
||||||
|
- Set up "of the day" content
|
||||||
|
|
||||||
|
### 5. Web Interface
|
||||||
|
- Access web interface at `http://ledpi:5000`
|
||||||
|
- Control display remotely
|
||||||
|
- Monitor system status
|
||||||
|
|
||||||
|
## Quick Reference
|
||||||
|
|
||||||
|
### Essential Commands
|
||||||
|
```bash
|
||||||
|
# Start display manually
|
||||||
|
sudo python3 display_controller.py
|
||||||
|
|
||||||
|
# Start service
|
||||||
|
sudo systemctl start ledmatrix.service
|
||||||
|
|
||||||
|
# Stop service
|
||||||
|
sudo systemctl stop ledmatrix.service
|
||||||
|
|
||||||
|
# Check status
|
||||||
|
sudo systemctl status ledmatrix.service
|
||||||
|
|
||||||
|
# View logs
|
||||||
|
journalctl -u ledmatrix.service
|
||||||
|
|
||||||
|
# Edit configuration
|
||||||
|
sudo nano config/config.json
|
||||||
|
|
||||||
|
# Edit secrets
|
||||||
|
sudo nano config/config_secrets.json
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configuration Files
|
||||||
|
- `config/config.json` - Main configuration
|
||||||
|
- `config/config_secrets.json` - API keys
|
||||||
|
- `ledmatrix.service` - Systemd service
|
||||||
|
|
||||||
|
### Important Directories
|
||||||
|
- `/var/cache/ledmatrix/` - Cache directory
|
||||||
|
- `assets/` - Logos, fonts, icons
|
||||||
|
- `src/` - Source code
|
||||||
|
- `config/` - Configuration files
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Congratulations!** Your LEDMatrix system is now running. Check out the other wiki pages for detailed configuration options and advanced features.
|
||||||
|
|
||||||
|
## Need Help?
|
||||||
|
|
||||||
|
- [YouTube Setup Video](https://www.youtube.com/watch?v=_HaqfJy1Y54)
|
||||||
|
- [Discord Community](https://discord.com/invite/uW36dVAtcT)
|
||||||
|
- [Project Website](https://www.chuck-builds.com/led-matrix/)
|
||||||
|
- [GitHub Issues](https://github.com/ChuckBuilds/LEDMatrix/issues)
|
||||||
516
WIKI_TROUBLESHOOTING.md
Normal file
516
WIKI_TROUBLESHOOTING.md
Normal file
@@ -0,0 +1,516 @@
|
|||||||
|
# Troubleshooting Guide
|
||||||
|
|
||||||
|
This guide covers common issues you may encounter with your LEDMatrix system and their solutions.
|
||||||
|
|
||||||
|
## Quick Diagnosis
|
||||||
|
|
||||||
|
### Check System Status
|
||||||
|
```bash
|
||||||
|
# Check service status
|
||||||
|
sudo systemctl status ledmatrix.service
|
||||||
|
|
||||||
|
# Check logs
|
||||||
|
journalctl -u ledmatrix.service -f
|
||||||
|
|
||||||
|
# Check display manually
|
||||||
|
sudo python3 display_controller.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### Check Hardware
|
||||||
|
```bash
|
||||||
|
# Check GPIO access
|
||||||
|
sudo python3 -c "import RPi.GPIO as GPIO; GPIO.setmode(GPIO.BCM); print('GPIO OK')"
|
||||||
|
|
||||||
|
# Check RGB matrix library
|
||||||
|
python3 -c 'from rgbmatrix import RGBMatrix, RGBMatrixOptions; print("RGB Matrix OK")'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common Issues
|
||||||
|
|
||||||
|
### 1. No Display Output
|
||||||
|
|
||||||
|
**Symptoms**: LED matrix shows no output or remains dark
|
||||||
|
|
||||||
|
**Possible Causes**:
|
||||||
|
- Hardware connection issues
|
||||||
|
- Incorrect hardware configuration
|
||||||
|
- Power supply problems
|
||||||
|
- GPIO conflicts
|
||||||
|
|
||||||
|
**Solutions**:
|
||||||
|
|
||||||
|
1. **Check Hardware Connections**:
|
||||||
|
```bash
|
||||||
|
# Verify Adafruit HAT is properly seated
|
||||||
|
# Check ribbon cable connections
|
||||||
|
# Ensure power supply is 5V 4A
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Verify Hardware Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"display": {
|
||||||
|
"hardware": {
|
||||||
|
"rows": 32,
|
||||||
|
"cols": 64,
|
||||||
|
"chain_length": 2,
|
||||||
|
"hardware_mapping": "adafruit-hat-pwm"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Test Basic Display**:
|
||||||
|
```bash
|
||||||
|
# Test minimal configuration
|
||||||
|
sudo python3 -c "
|
||||||
|
from rgbmatrix import RGBMatrix, RGBMatrixOptions
|
||||||
|
options = RGBMatrixOptions()
|
||||||
|
options.rows = 32
|
||||||
|
options.cols = 64
|
||||||
|
options.chain_length = 2
|
||||||
|
options.hardware_mapping = 'adafruit-hat-pwm'
|
||||||
|
matrix = RGBMatrix(options=options)
|
||||||
|
print('Matrix initialized successfully')
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Check Audio Conflicts**:
|
||||||
|
```bash
|
||||||
|
# Remove audio services
|
||||||
|
sudo apt-get remove bluez bluez-firmware pi-bluetooth triggerhappy pigpio
|
||||||
|
|
||||||
|
# Blacklist sound module
|
||||||
|
echo "blacklist snd_bcm2835" | sudo tee /etc/modprobe.d/blacklist-rgb-matrix.conf
|
||||||
|
sudo update-initramfs -u
|
||||||
|
sudo reboot
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Permission Errors
|
||||||
|
|
||||||
|
**Symptoms**: `Permission denied` or `Access denied` errors
|
||||||
|
|
||||||
|
**Solutions**:
|
||||||
|
|
||||||
|
1. **Set Home Directory Permissions**:
|
||||||
|
```bash
|
||||||
|
sudo chmod o+x /home/ledpi
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Check File Permissions**:
|
||||||
|
```bash
|
||||||
|
# Check config file permissions
|
||||||
|
ls -la config/
|
||||||
|
|
||||||
|
# Fix permissions if needed
|
||||||
|
sudo chown ledpi:ledpi config/config.json
|
||||||
|
sudo chmod 644 config/config.json
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Cache Directory Permissions**:
|
||||||
|
```bash
|
||||||
|
chmod +x fix_cache_permissions.sh
|
||||||
|
./fix_cache_permissions.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Import Errors
|
||||||
|
|
||||||
|
**Symptoms**: `ModuleNotFoundError` or `ImportError`
|
||||||
|
|
||||||
|
**Solutions**:
|
||||||
|
|
||||||
|
1. **Reinstall RGB Matrix Library**:
|
||||||
|
```bash
|
||||||
|
cd rpi-rgb-led-matrix-master
|
||||||
|
sudo make build-python PYTHON=$(which python3)
|
||||||
|
cd bindings/python
|
||||||
|
sudo python3 setup.py install
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Check Python Path**:
|
||||||
|
```bash
|
||||||
|
python3 -c "import sys; print(sys.path)"
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Reinstall Dependencies**:
|
||||||
|
```bash
|
||||||
|
sudo pip3 install --break-system-packages -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. No Data Displayed
|
||||||
|
|
||||||
|
**Symptoms**: Display shows but no content appears
|
||||||
|
|
||||||
|
**Solutions**:
|
||||||
|
|
||||||
|
1. **Check Configuration**:
|
||||||
|
```bash
|
||||||
|
# Validate JSON syntax
|
||||||
|
python3 -m json.tool config/config.json
|
||||||
|
|
||||||
|
# Check if features are enabled
|
||||||
|
grep -A 5 '"enabled"' config/config.json
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Check API Keys**:
|
||||||
|
```bash
|
||||||
|
# Verify secrets file exists
|
||||||
|
ls -la config/config_secrets.json
|
||||||
|
|
||||||
|
# Check API key format
|
||||||
|
cat config/config_secrets.json
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Test Individual Components**:
|
||||||
|
```bash
|
||||||
|
# Test clock
|
||||||
|
python3 -c "from src.clock import Clock; from src.display_manager import DisplayManager; c = Clock(DisplayManager({})); c.display()"
|
||||||
|
|
||||||
|
# Test weather (requires API key)
|
||||||
|
python3 -c "from src.weather_manager import WeatherManager; from src.display_manager import DisplayManager; w = WeatherManager({'weather': {'enabled': True}}, DisplayManager({})); w.display_weather()"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Performance Issues
|
||||||
|
|
||||||
|
**Symptoms**: Flickering, slow updates, or system lag
|
||||||
|
|
||||||
|
**Solutions**:
|
||||||
|
|
||||||
|
1. **Optimize Hardware Settings**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"display": {
|
||||||
|
"hardware": {
|
||||||
|
"gpio_slowdown": 3,
|
||||||
|
"limit_refresh_rate_hz": 120,
|
||||||
|
"pwm_bits": 9
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Reduce Update Frequency**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"weather": {
|
||||||
|
"update_interval": 3600
|
||||||
|
},
|
||||||
|
"stocks": {
|
||||||
|
"update_interval": 1800
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Disable Unused Features**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"stock_news": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"odds_ticker": {
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Network/API Issues
|
||||||
|
|
||||||
|
**Symptoms**: No weather, stocks, or sports data
|
||||||
|
|
||||||
|
**Solutions**:
|
||||||
|
|
||||||
|
1. **Check Internet Connection**:
|
||||||
|
```bash
|
||||||
|
ping -c 3 google.com
|
||||||
|
curl -I https://api.openweathermap.org
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Verify API Keys**:
|
||||||
|
```bash
|
||||||
|
# Test OpenWeatherMap API
|
||||||
|
curl "http://api.openweathermap.org/data/2.5/weather?q=London&appid=YOUR_API_KEY"
|
||||||
|
|
||||||
|
# Test Yahoo Finance
|
||||||
|
curl "https://query1.finance.yahoo.com/v8/finance/chart/AAPL"
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Check Rate Limits**:
|
||||||
|
- OpenWeatherMap: 1000 calls/day
|
||||||
|
- Yahoo Finance: 2000 calls/hour
|
||||||
|
- ESPN API: No documented limits
|
||||||
|
|
||||||
|
### 7. Service Issues
|
||||||
|
|
||||||
|
**Symptoms**: Service won't start or stops unexpectedly
|
||||||
|
|
||||||
|
**Solutions**:
|
||||||
|
|
||||||
|
1. **Check Service Status**:
|
||||||
|
```bash
|
||||||
|
sudo systemctl status ledmatrix.service
|
||||||
|
sudo journalctl -u ledmatrix.service -f
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Reinstall Service**:
|
||||||
|
```bash
|
||||||
|
sudo systemctl stop ledmatrix.service
|
||||||
|
sudo systemctl disable ledmatrix.service
|
||||||
|
chmod +x install_service.sh
|
||||||
|
sudo ./install_service.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Check Service File**:
|
||||||
|
```bash
|
||||||
|
cat /etc/systemd/system/ledmatrix.service
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8. Cache Issues
|
||||||
|
|
||||||
|
**Symptoms**: Data not updating or cache warnings
|
||||||
|
|
||||||
|
**Solutions**:
|
||||||
|
|
||||||
|
1. **Setup Persistent Cache**:
|
||||||
|
```bash
|
||||||
|
chmod +x setup_cache.sh
|
||||||
|
./setup_cache.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Clear Cache**:
|
||||||
|
```bash
|
||||||
|
sudo rm -rf /var/cache/ledmatrix/*
|
||||||
|
sudo rm -rf /tmp/ledmatrix_cache/*
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Check Cache Permissions**:
|
||||||
|
```bash
|
||||||
|
ls -la /var/cache/ledmatrix/
|
||||||
|
ls -la /tmp/ledmatrix_cache/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 9. Font/Display Issues
|
||||||
|
|
||||||
|
**Symptoms**: Text not displaying correctly or missing fonts
|
||||||
|
|
||||||
|
**Solutions**:
|
||||||
|
|
||||||
|
1. **Check Font Files**:
|
||||||
|
```bash
|
||||||
|
ls -la assets/fonts/
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Reinstall Fonts**:
|
||||||
|
```bash
|
||||||
|
# Copy fonts from repository
|
||||||
|
sudo cp assets/fonts/* /usr/share/fonts/truetype/
|
||||||
|
sudo fc-cache -fv
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Test Font Loading**:
|
||||||
|
```bash
|
||||||
|
python3 -c "from PIL import ImageFont; font = ImageFont.truetype('assets/fonts/PressStart2P-Regular.ttf', 8); print('Font loaded')"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 10. Music Integration Issues
|
||||||
|
|
||||||
|
**Symptoms**: Spotify or YouTube Music not working
|
||||||
|
|
||||||
|
**Solutions**:
|
||||||
|
|
||||||
|
1. **Spotify Authentication**:
|
||||||
|
```bash
|
||||||
|
sudo python3 src/authenticate_spotify.py
|
||||||
|
sudo chmod 644 config/spotify_auth.json
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **YouTube Music Setup**:
|
||||||
|
```bash
|
||||||
|
# Ensure YTMD companion server is running
|
||||||
|
# Check URL in config
|
||||||
|
sudo python3 src/authenticate_ytm.py
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Check Music Configuration**:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"music": {
|
||||||
|
"enabled": true,
|
||||||
|
"preferred_source": "ytm",
|
||||||
|
"YTM_COMPANION_URL": "http://192.168.1.100:9863"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Troubleshooting
|
||||||
|
|
||||||
|
### Debug Mode
|
||||||
|
|
||||||
|
Enable detailed logging:
|
||||||
|
```bash
|
||||||
|
# Edit display_controller.py
|
||||||
|
# Change logging level to DEBUG
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test Individual Managers
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Test weather manager
|
||||||
|
python3 -c "
|
||||||
|
from src.weather_manager import WeatherManager
|
||||||
|
from src.display_manager import DisplayManager
|
||||||
|
config = {'weather': {'enabled': True}}
|
||||||
|
w = WeatherManager(config, DisplayManager(config))
|
||||||
|
w.display_weather()
|
||||||
|
"
|
||||||
|
|
||||||
|
# Test stock manager
|
||||||
|
python3 -c "
|
||||||
|
from src.stock_manager import StockManager
|
||||||
|
from src.display_manager import DisplayManager
|
||||||
|
config = {'stocks': {'enabled': True, 'symbols': ['AAPL']}}
|
||||||
|
s = StockManager(config, DisplayManager(config))
|
||||||
|
s.display_stocks()
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Hardware Diagnostics
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check GPIO pins
|
||||||
|
sudo python3 -c "
|
||||||
|
import RPi.GPIO as GPIO
|
||||||
|
GPIO.setmode(GPIO.BCM)
|
||||||
|
pins = [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]
|
||||||
|
for pin in pins:
|
||||||
|
try:
|
||||||
|
GPIO.setup(pin, GPIO.OUT)
|
||||||
|
GPIO.output(pin, GPIO.HIGH)
|
||||||
|
print(f'Pin {pin}: OK')
|
||||||
|
except:
|
||||||
|
print(f'Pin {pin}: ERROR')
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Performance Monitoring
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Monitor system resources
|
||||||
|
htop
|
||||||
|
|
||||||
|
# Check memory usage
|
||||||
|
free -h
|
||||||
|
|
||||||
|
# Monitor network
|
||||||
|
iftop
|
||||||
|
|
||||||
|
# Check disk usage
|
||||||
|
df -h
|
||||||
|
```
|
||||||
|
|
||||||
|
## Recovery Procedures
|
||||||
|
|
||||||
|
### Complete Reset
|
||||||
|
|
||||||
|
If all else fails, perform a complete reset:
|
||||||
|
|
||||||
|
1. **Backup Configuration**:
|
||||||
|
```bash
|
||||||
|
cp config/config.json config/config.json.backup
|
||||||
|
cp config/config_secrets.json config/config_secrets.json.backup
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Reinstall System**:
|
||||||
|
```bash
|
||||||
|
sudo systemctl stop ledmatrix.service
|
||||||
|
sudo systemctl disable ledmatrix.service
|
||||||
|
sudo rm -rf /var/cache/ledmatrix
|
||||||
|
sudo rm -rf /tmp/ledmatrix_cache
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Fresh Installation**:
|
||||||
|
```bash
|
||||||
|
cd ~
|
||||||
|
rm -rf LEDMatrix
|
||||||
|
git clone https://github.com/ChuckBuilds/LEDMatrix.git
|
||||||
|
cd LEDMatrix
|
||||||
|
# Follow installation steps again
|
||||||
|
```
|
||||||
|
|
||||||
|
### Emergency Mode
|
||||||
|
|
||||||
|
If the system won't start, try emergency mode:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Stop all services
|
||||||
|
sudo systemctl stop ledmatrix.service
|
||||||
|
|
||||||
|
# Run with minimal config
|
||||||
|
sudo python3 display_controller.py --emergency
|
||||||
|
|
||||||
|
# Or run individual components
|
||||||
|
sudo python3 -c "
|
||||||
|
from src.clock import Clock
|
||||||
|
from src.display_manager import DisplayManager
|
||||||
|
c = Clock(DisplayManager({}))
|
||||||
|
while True:
|
||||||
|
c.display()
|
||||||
|
import time
|
||||||
|
time.sleep(1)
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Getting Help
|
||||||
|
|
||||||
|
### Before Asking for Help
|
||||||
|
|
||||||
|
1. **Collect Information**:
|
||||||
|
```bash
|
||||||
|
# System info
|
||||||
|
uname -a
|
||||||
|
cat /etc/os-release
|
||||||
|
|
||||||
|
# Service status
|
||||||
|
sudo systemctl status ledmatrix.service
|
||||||
|
|
||||||
|
# Recent logs
|
||||||
|
journalctl -u ledmatrix.service --since "1 hour ago"
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
cat config/config.json
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Test Basic Functionality**:
|
||||||
|
```bash
|
||||||
|
# Test RGB matrix
|
||||||
|
python3 -c 'from rgbmatrix import RGBMatrix, RGBMatrixOptions; print("RGB Matrix OK")'
|
||||||
|
|
||||||
|
# Test display
|
||||||
|
sudo python3 display_controller.py
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Check Common Issues**:
|
||||||
|
- Verify hardware connections
|
||||||
|
- Check API keys
|
||||||
|
- Validate configuration
|
||||||
|
- Test network connectivity
|
||||||
|
|
||||||
|
### Where to Get Help
|
||||||
|
|
||||||
|
1. **Discord Community**: [ChuckBuilds Discord](https://discord.com/invite/uW36dVAtcT)
|
||||||
|
2. **GitHub Issues**: [LEDMatrix Issues](https://github.com/ChuckBuilds/LEDMatrix/issues)
|
||||||
|
3. **YouTube**: [ChuckBuilds Channel](https://www.youtube.com/@ChuckBuilds)
|
||||||
|
4. **Project Website**: [ChuckBuilds.com](https://www.chuck-builds.com/led-matrix/)
|
||||||
|
|
||||||
|
### When Reporting Issues
|
||||||
|
|
||||||
|
Include the following information:
|
||||||
|
- Hardware setup (Pi model, matrix type)
|
||||||
|
- Software version (OS, Python version)
|
||||||
|
- Error messages and logs
|
||||||
|
- Steps to reproduce
|
||||||
|
- What you've already tried
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*This troubleshooting guide covers the most common issues. If you're still having problems, check the community resources for additional help.*
|
||||||
Reference in New Issue
Block a user