- Replaced hardcoded paths with dynamic path detection using __file__ - Auto-update now works regardless of folder case (prezenta vs Prezenta) - Added comprehensive dependency management documentation - Enhanced port 80 capability setup script - Updated system packages repository structure - Fixed path resolution for Files/reposytory and system_packages directories
7.1 KiB
Prezenta App - Robust Dependency Management System
Overview
The app.py has been updated to include a comprehensive, self-contained dependency management system that automatically checks and installs required packages from a local repository. This makes the system completely offline-capable and resilient to network issues.
Key Features
🔧 Automatic Dependency Installation
- Self-contained: No need for separate launcher scripts or shell scripts
- Offline capability: Installs packages from local
./Files/reposytorydirectory - Smart detection: Checks if packages are already installed before attempting installation
- Fallback mechanisms: Multiple installation methods (pip, apt, local wheels)
🛡️ Robust Error Handling
- Network resilience: Handles socket errors gracefully with file-based fallbacks
- Import safety: Safe import functions that don't crash the app
- Graceful degradation: App continues to work even if some optional features fail
- Comprehensive logging: All operations are logged for debugging
📦 Supported Packages
The system automatically manages these packages:
rdm6300- RFID reader library (critical)requests- HTTP library (critical)aiohttp- Async HTTP library (optional)flask- Web server for command interface (optional)gpiozero- GPIO control (falls back to dummy if not available)- All required dependencies (urllib3, certifi, charset_normalizer, etc.)
How It Works
1. Startup Dependency Check
When the app starts, it:
- Checks each required package using
importlib.util.find_spec() - Identifies missing packages
- Attempts installation from local wheel files in
./Files/reposytory - Falls back to pip/apt if needed
- Continues execution even if some packages fail to install
2. Safe Import System
def safe_import(module_name, package_name=None):
"""Safely import a module with error handling"""
- Imports modules without crashing the app
- Returns None for missing modules
- Allows the app to adapt to available packages
3. Network Error Resilience
- Device hostname/IP saved to
./data/device_info.txt - Automatically loads from file when socket errors occur
- Never crashes due to network resolution issues
4. Graceful Feature Degradation
- No Flask: Command server is disabled with warning
- No gpiozero: LED functions become print statements
- No aiohttp: Falls back to synchronous requests
- No network: Uses cached device information
Repository Structure
Required Files in ./Files/reposytory/:
├── rdm6300-0.1.1-py3-none-any.whl
├── requests-2.32.3-py3-none-any.whl
├── aiohttp-3.11.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
├── flask-*.whl (optional)
├── urllib3-2.3.0-py3-none-any.whl
├── certifi-2025.1.31-py3-none-any.whl
├── charset_normalizer-3.4.1-py3-none-any.whl
├── idna-3.10-py3-none-any.whl
├── multidict-6.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
├── aiosignal-1.3.2-py2.py3-none-any.whl
├── frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
├── attrs-25.3.0-py3-none-any.whl
├── yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
├── aiohappyeyeballs-2.6.1-py3-none-any.whl
└── propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Installation Process
Automatic (Recommended)
Simply run the app - dependencies will be installed automatically:
cd /home/pi/Desktop/prezenta
python3 app.py
Manual Testing
Test the dependency system:
cd /home/pi/Desktop/prezenta
python3 test_dependencies.py
Folder Structure
The prezenta folder has been streamlined for maximum simplicity:
prezenta/
├── app.py # Main application (self-contained)
├── config.py # Configuration module
├── test_dependencies.py # Testing and validation script
├── README_DEPENDENCIES.md # This documentation
├── data/ # Application data
│ ├── device_info.txt # Network configuration cache (auto-created)
│ ├── idmasa.txt # Device identifier
│ └── tag.txt # Backup data
└── Files/ # Local package repository
└── reposytory/ # Wheel files for offline installation
├── rdm6300-*.whl
├── requests-*.whl
├── aiohttp-*.whl
└── ... (all dependencies)
Removed Files (No Longer Needed)
- App is now self-launchinglauncher.py- Dependency installation integrated into app.pylibraries.sh- Functionality moved to app.pycheck_dependencies.py
Features Added
1. Self-Installing Dependencies
- Checks all required packages on startup
- Installs missing packages from local repository
- No external network dependencies for package installation
2. Network Error Recovery
- Handles
socket.gaierrorgracefully - Saves working network configuration to file
- Loads from file when network issues occur
3. Modular Feature Set
- Core RFID functionality always works
- Optional features (web interface, LEDs) degrade gracefully
- Clear status messages for all operations
4. Enhanced Logging
- Dependency check results logged
- Installation attempts logged
- Network fallback operations logged
Troubleshooting
Common Issues
-
"Repository not found"
- Ensure
./Files/reposytorydirectory exists - Check that wheel files are present
- Ensure
-
"Permission denied during installation"
- Script uses
--break-system-packagesflag - May need to run with appropriate permissions
- Script uses
-
"rdm6300 is required"
- This is critical - app will exit if rdm6300 can't be installed
- Check that
rdm6300-0.1.1-py3-none-any.whlexists in repository
-
"Flask not available - Command server disabled"
- Non-critical - RFID functionality continues to work
- Install Flask manually if remote command capability is needed
Recovery Steps
- Check repository: Ensure all wheel files are present
- Test installation: Run
python3 test_dependencies.py - Manual install: Install missing packages manually with pip
- Check logs: Review console output for specific error messages
Benefits
- Zero-configuration deployment: Just copy files and run
- Offline operation: No internet required after initial setup
- Fault tolerance: Continues working even with partial failures
- Easy maintenance: All dependencies managed automatically
- Clear diagnostics: Detailed status reporting for troubleshooting
Version History
- v2.4: Added robust dependency management and network error handling
- v2.3: Added remote command execution capabilities
- v2.2: Basic RFID and logging functionality
The system is now production-ready for deployment in environments with limited or no internet connectivity, providing maximum reliability and ease of deployment.