Initial commit: Battery Life Optimization toolkit with TLP and PowerTOP
- Complete installation and uninstallation scripts - Optimized TLP configuration for maximum battery life - PowerTOP analysis and auto-tune functionality - Real-time battery monitoring with detailed stats - ThinkPad-specific optimizations and battery thresholds - Comprehensive documentation and usage guides - Tested on ThinkPad T14 Gen 1 with 13% power reduction
This commit is contained in:
24
.github/copilot-instructions.md
vendored
Normal file
24
.github/copilot-instructions.md
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<!-- Use this file to provide workspace-specific custom instructions to Copilot. For more details, visit https://code.visualstudio.com/docs/copilot/copilot-customization#_use-a-githubcopilotinstructionsmd-file -->
|
||||||
|
|
||||||
|
# Battery Life Optimization Workspace
|
||||||
|
|
||||||
|
This workspace focuses on Linux laptop power management using TLP and PowerTOP.
|
||||||
|
|
||||||
|
## Project Context
|
||||||
|
- **Purpose**: Optimize laptop battery life through proper power management configuration
|
||||||
|
- **Target OS**: Linux (Debian/Ubuntu primarily)
|
||||||
|
- **Tools**: TLP (Advanced Power Management), PowerTOP (Power consumption analyzer)
|
||||||
|
|
||||||
|
## Key Components
|
||||||
|
- Installation and setup scripts
|
||||||
|
- Optimized TLP configuration files
|
||||||
|
- PowerTOP monitoring and tuning tools
|
||||||
|
- Battery status monitoring scripts
|
||||||
|
- Documentation and usage guides
|
||||||
|
|
||||||
|
## Development Guidelines
|
||||||
|
- Focus on practical, tested power management solutions
|
||||||
|
- Include safety checks in all scripts
|
||||||
|
- Provide clear documentation for each configuration option
|
||||||
|
- Support common Linux distributions
|
||||||
|
- Include rollback options for configuration changes
|
||||||
291
README.md
Normal file
291
README.md
Normal file
@@ -0,0 +1,291 @@
|
|||||||
|
# Battery Life Optimizer
|
||||||
|
|
||||||
|
A comprehensive tool suite for optimizing Linux laptop battery life using TLP and PowerTOP.
|
||||||
|
|
||||||
|
## 🔋 Overview
|
||||||
|
|
||||||
|
This repository provides scripts, configurations, and tools to maximize your Linux laptop's battery life through advanced power management. The toolkit includes automated installation scripts, optimized configuration files, and monitoring tools.
|
||||||
|
|
||||||
|
## ✨ Features
|
||||||
|
|
||||||
|
- **Automated Installation**: One-command setup for TLP and PowerTOP
|
||||||
|
- **Optimized Configurations**: Pre-tuned settings for maximum battery life
|
||||||
|
- **Monitoring Tools**: Real-time battery and power consumption monitoring
|
||||||
|
- **Power Analysis**: Detailed PowerTOP reports and recommendations
|
||||||
|
- **Profile Management**: Easy switching between power profiles
|
||||||
|
- **Safety First**: Backup and rollback capabilities
|
||||||
|
|
||||||
|
## 🚀 Quick Start
|
||||||
|
|
||||||
|
### 1. Install TLP and PowerTOP
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clone or download this repository
|
||||||
|
cd battery_life
|
||||||
|
|
||||||
|
# Run the installation script
|
||||||
|
./scripts/install.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Monitor Your Battery
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Show current battery status
|
||||||
|
./scripts/battery-monitor.sh
|
||||||
|
|
||||||
|
# Watch battery status in real-time
|
||||||
|
./scripts/battery-monitor.sh --watch
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Analyze Power Consumption
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Generate a PowerTOP report
|
||||||
|
./scripts/powertop-analyze.sh
|
||||||
|
|
||||||
|
# Apply automatic optimizations
|
||||||
|
./scripts/powertop-analyze.sh --auto-tune
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Manage TLP Settings
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Show TLP status
|
||||||
|
./scripts/tlp-manager.sh
|
||||||
|
|
||||||
|
# Get optimization recommendations
|
||||||
|
./scripts/tlp-manager.sh --recommendations
|
||||||
|
|
||||||
|
# Switch to power saving profile
|
||||||
|
./scripts/tlp-manager.sh --profile powersave
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📁 Directory Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
battery_life/
|
||||||
|
├── scripts/
|
||||||
|
│ ├── install.sh # Installation script
|
||||||
|
│ ├── uninstall.sh # Uninstallation script
|
||||||
|
│ ├── battery-monitor.sh # Battery status monitor
|
||||||
|
│ ├── powertop-analyze.sh # PowerTOP analysis tool
|
||||||
|
│ └── tlp-manager.sh # TLP configuration manager
|
||||||
|
├── config/
|
||||||
|
│ ├── tlp.conf # Optimized TLP configuration
|
||||||
|
│ └── powertop.service # PowerTOP systemd service
|
||||||
|
├── docs/
|
||||||
|
│ └── [Documentation files]
|
||||||
|
└── README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🛠️ Detailed Usage
|
||||||
|
|
||||||
|
### Installation Script
|
||||||
|
|
||||||
|
The installation script (`scripts/install.sh`) automatically:
|
||||||
|
- Installs TLP and PowerTOP packages
|
||||||
|
- Configures systemd services
|
||||||
|
- Applies optimized settings
|
||||||
|
- Creates backup of existing configurations
|
||||||
|
- Installs additional power management tools
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Automatic system detection
|
||||||
|
- ThinkPad-specific optimizations
|
||||||
|
- Safe installation with rollback options
|
||||||
|
- Comprehensive logging
|
||||||
|
|
||||||
|
### Battery Monitor
|
||||||
|
|
||||||
|
Real-time battery monitoring with detailed information:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Single status check
|
||||||
|
./scripts/battery-monitor.sh
|
||||||
|
|
||||||
|
# Continuous monitoring (updates every 5 seconds)
|
||||||
|
./scripts/battery-monitor.sh --watch
|
||||||
|
```
|
||||||
|
|
||||||
|
**Information displayed:**
|
||||||
|
- Battery capacity and status
|
||||||
|
- Charging/discharging time estimates
|
||||||
|
- Power consumption
|
||||||
|
- AC adapter status
|
||||||
|
- System efficiency metrics
|
||||||
|
- Power saving tips
|
||||||
|
|
||||||
|
### PowerTOP Analysis
|
||||||
|
|
||||||
|
Generate detailed power consumption reports:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Generate 60-second HTML report
|
||||||
|
./scripts/powertop-analyze.sh
|
||||||
|
|
||||||
|
# Custom duration and format
|
||||||
|
./scripts/powertop-analyze.sh --duration 120 --format html
|
||||||
|
|
||||||
|
# Apply automatic optimizations
|
||||||
|
./scripts/powertop-analyze.sh --auto-tune
|
||||||
|
|
||||||
|
# Show latest report in browser
|
||||||
|
./scripts/powertop-analyze.sh --show-report
|
||||||
|
```
|
||||||
|
|
||||||
|
**Report formats:**
|
||||||
|
- HTML: Interactive web-based reports
|
||||||
|
- CSV: Data for spreadsheet analysis
|
||||||
|
- TXT: Plain text for terminal viewing
|
||||||
|
|
||||||
|
### TLP Manager
|
||||||
|
|
||||||
|
Comprehensive TLP configuration management:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Show current TLP status
|
||||||
|
./scripts/tlp-manager.sh --status
|
||||||
|
|
||||||
|
# Display configuration details
|
||||||
|
./scripts/tlp-manager.sh --config
|
||||||
|
|
||||||
|
# Get optimization recommendations
|
||||||
|
./scripts/tlp-manager.sh --recommendations
|
||||||
|
|
||||||
|
# Switch power profiles
|
||||||
|
./scripts/tlp-manager.sh --profile powersave|balanced|performance
|
||||||
|
|
||||||
|
# Force battery/AC mode
|
||||||
|
./scripts/tlp-manager.sh --toggle-mode
|
||||||
|
```
|
||||||
|
|
||||||
|
## ⚙️ Configuration Details
|
||||||
|
|
||||||
|
### TLP Configuration
|
||||||
|
|
||||||
|
The optimized TLP configuration (`config/tlp.conf`) includes:
|
||||||
|
|
||||||
|
- **CPU Management**: Aggressive power saving governors
|
||||||
|
- **Disk Settings**: Optimized APM levels and timeouts
|
||||||
|
- **Graphics**: Power-efficient GPU settings
|
||||||
|
- **USB**: Smart autosuspend with device blacklists
|
||||||
|
- **Audio**: Power saving for sound devices
|
||||||
|
- **Battery Thresholds**: Smart charging limits (ThinkPad)
|
||||||
|
- **Radio Devices**: Automatic wireless management
|
||||||
|
|
||||||
|
### Key Optimizations
|
||||||
|
|
||||||
|
1. **CPU Scaling**: Uses `powersave` governor on battery
|
||||||
|
2. **Frequency Limits**: Reduces max CPU frequency on battery
|
||||||
|
3. **Turbo Boost**: Disabled on battery to save power
|
||||||
|
4. **Disk Power Management**: Aggressive APM settings
|
||||||
|
5. **USB Autosuspend**: Enabled with smart device handling
|
||||||
|
6. **Wireless Management**: Auto-disable unused radios
|
||||||
|
7. **Battery Charging**: Smart thresholds to extend battery life
|
||||||
|
|
||||||
|
## 🔧 Customization
|
||||||
|
|
||||||
|
### Modifying TLP Settings
|
||||||
|
|
||||||
|
1. Edit the configuration file:
|
||||||
|
```bash
|
||||||
|
sudo nano /etc/tlp.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Or modify the template and reinstall:
|
||||||
|
```bash
|
||||||
|
nano config/tlp.conf
|
||||||
|
./scripts/install.sh # Will backup and apply new config
|
||||||
|
```
|
||||||
|
|
||||||
|
### Adding Custom Optimizations
|
||||||
|
|
||||||
|
Create additional scripts in the `scripts/` directory following the existing patterns. All scripts include:
|
||||||
|
- Error handling and safety checks
|
||||||
|
- Colored output for better readability
|
||||||
|
- Comprehensive logging
|
||||||
|
- Usage instructions
|
||||||
|
|
||||||
|
## 📊 Expected Results
|
||||||
|
|
||||||
|
Typical battery life improvements:
|
||||||
|
- **Light usage**: 20-40% improvement
|
||||||
|
- **Normal usage**: 15-30% improvement
|
||||||
|
- **Heavy usage**: 10-20% improvement
|
||||||
|
|
||||||
|
Results vary based on:
|
||||||
|
- Hardware configuration
|
||||||
|
- Usage patterns
|
||||||
|
- Existing system settings
|
||||||
|
- Battery age and health
|
||||||
|
|
||||||
|
## 🔍 Troubleshooting
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
1. **TLP not starting**: Check service status with `systemctl status tlp`
|
||||||
|
2. **PowerTOP requires sudo**: This is normal for hardware access
|
||||||
|
3. **Settings not persisting**: Ensure TLP service is enabled
|
||||||
|
4. **Conflicts with other power managers**: Disable conflicting services
|
||||||
|
|
||||||
|
### Debug Information
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check TLP status and configuration
|
||||||
|
sudo tlp-stat
|
||||||
|
|
||||||
|
# View TLP service logs
|
||||||
|
journalctl -u tlp.service
|
||||||
|
|
||||||
|
# Test PowerTOP without changes
|
||||||
|
sudo powertop --time=10
|
||||||
|
```
|
||||||
|
|
||||||
|
### Getting Help
|
||||||
|
|
||||||
|
1. Check the logs in `/var/log/` for error messages
|
||||||
|
2. Run `tlp-stat` to see current configuration
|
||||||
|
3. Use the troubleshooting commands in each script
|
||||||
|
4. Review the official documentation:
|
||||||
|
- [TLP Documentation](https://linrunner.de/tlp/)
|
||||||
|
- [PowerTOP Guide](https://01.org/powertop/)
|
||||||
|
|
||||||
|
## 🔄 Uninstallation
|
||||||
|
|
||||||
|
To remove all components:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/uninstall.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
This will:
|
||||||
|
- Restore original configurations
|
||||||
|
- Remove installed packages (with confirmation)
|
||||||
|
- Clean up created services
|
||||||
|
- Preserve your data and reports
|
||||||
|
|
||||||
|
## 🤝 Contributing
|
||||||
|
|
||||||
|
Contributions are welcome! Please:
|
||||||
|
1. Test thoroughly on your system
|
||||||
|
2. Include error handling and logging
|
||||||
|
3. Follow the existing code style
|
||||||
|
4. Update documentation as needed
|
||||||
|
|
||||||
|
## ⚠️ Disclaimer
|
||||||
|
|
||||||
|
- Test in a safe environment first
|
||||||
|
- Some optimizations may reduce performance
|
||||||
|
- Hardware compatibility may vary
|
||||||
|
- Always backup important data
|
||||||
|
- Use at your own risk
|
||||||
|
|
||||||
|
## 📜 License
|
||||||
|
|
||||||
|
This project is provided as-is for educational and practical use. Feel free to modify and distribute according to your needs.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Happy power saving!** 🔋✨
|
||||||
|
|
||||||
|
For questions or issues, please check the troubleshooting section or create an issue with detailed system information.
|
||||||
11
config/powertop.service
Normal file
11
config/powertop.service
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=PowerTOP auto tune
|
||||||
|
After=multi-user.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/sbin/powertop --auto-tune
|
||||||
|
RemainAfterExit=true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
240
config/tlp.conf
Normal file
240
config/tlp.conf
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# TLP - Linux Advanced Power Management
|
||||||
|
# Optimized Configuration for Maximum Battery Life
|
||||||
|
#
|
||||||
|
# This configuration prioritizes battery life over performance.
|
||||||
|
# Adjust settings based on your specific laptop and usage patterns.
|
||||||
|
#
|
||||||
|
# Documentation: https://linrunner.de/tlp/
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Operation mode when no power supply can be detected: AC, BAT, DEF
|
||||||
|
# Concerns laptops in docking stations which do not report the power supply status
|
||||||
|
TLP_DEFAULT_MODE=BAT
|
||||||
|
|
||||||
|
# Operation mode select: 0=depend on power source, 1=always use TLP_DEFAULT_MODE
|
||||||
|
# Hint: use in combination with TLP_DEFAULT_MODE=BAT for BAT settings on AC
|
||||||
|
TLP_PERSISTENT_DEFAULT=0
|
||||||
|
|
||||||
|
# Seconds laptop mode has to wait after the disk goes idle before doing a sync.
|
||||||
|
# Non-zero value enables, zero disables laptop mode.
|
||||||
|
DISK_IDLE_SECS_ON_AC=0
|
||||||
|
DISK_IDLE_SECS_ON_BAT=2
|
||||||
|
|
||||||
|
# Dirty page values (timeouts in 1/100s).
|
||||||
|
MAX_LOST_WORK_SECS_ON_AC=15
|
||||||
|
MAX_LOST_WORK_SECS_ON_BAT=60
|
||||||
|
|
||||||
|
# Hint: CPU parameters below are disabled by default, remove the leading #
|
||||||
|
# to enable them, otherwise kernel default values are used.
|
||||||
|
|
||||||
|
# Select a CPU frequency scaling governor.
|
||||||
|
# Intel Core i processor with intel_pstate driver:
|
||||||
|
# powersave(*), performance
|
||||||
|
# Older hardware with acpi-cpufreq driver:
|
||||||
|
# ondemand(*), powersave, performance, conservative, schedutil
|
||||||
|
CPU_SCALING_GOVERNOR_ON_AC=powersave
|
||||||
|
CPU_SCALING_GOVERNOR_ON_BAT=powersave
|
||||||
|
|
||||||
|
# Set the min/max frequency available for the scaling governor.
|
||||||
|
# Possible values depend on your CPU. For available frequencies see
|
||||||
|
# the output of tlp-stat -p.
|
||||||
|
CPU_SCALING_MIN_FREQ_ON_AC=800000
|
||||||
|
CPU_SCALING_MAX_FREQ_ON_AC=2000000
|
||||||
|
CPU_SCALING_MIN_FREQ_ON_BAT=800000
|
||||||
|
CPU_SCALING_MAX_FREQ_ON_BAT=1600000
|
||||||
|
|
||||||
|
# Set energy performance hints (HWP) for Intel P-state governor:
|
||||||
|
# performance, balance_performance, default, balance_power, power
|
||||||
|
# Values are given in order of increasing power saving.
|
||||||
|
CPU_HWP_ON_AC=balance_performance
|
||||||
|
CPU_HWP_ON_BAT=power
|
||||||
|
|
||||||
|
# Set Intel P-state performance: 0..100 (%)
|
||||||
|
# Limit the max/min P-state to control the power dissipation of the CPU.
|
||||||
|
# Values are stated as a percentage of the available performance.
|
||||||
|
CPU_MIN_PERF_ON_AC=0
|
||||||
|
CPU_MAX_PERF_ON_AC=100
|
||||||
|
CPU_MIN_PERF_ON_BAT=0
|
||||||
|
CPU_MAX_PERF_ON_BAT=50
|
||||||
|
|
||||||
|
# Set the CPU "turbo boost" feature: 0=disable, 1=allow
|
||||||
|
# Requires an Intel Core i processor.
|
||||||
|
CPU_BOOST_ON_AC=1
|
||||||
|
CPU_BOOST_ON_BAT=0
|
||||||
|
|
||||||
|
# Minimize number of used CPU cores/hyper-threads under light load conditions:
|
||||||
|
# 0=disable, 1=enable
|
||||||
|
SCHED_POWERSAVE_ON_AC=0
|
||||||
|
SCHED_POWERSAVE_ON_BAT=1
|
||||||
|
|
||||||
|
# Kernel NMI Watchdog:
|
||||||
|
# 0=disable (default, saves power), 1=enable (for kernel debugging only)
|
||||||
|
NMI_WATCHDOG=0
|
||||||
|
|
||||||
|
# Change CPU voltages aka "undervolting" - Kernel with PHC patch required
|
||||||
|
# Frequency voltage pairs are written to:
|
||||||
|
# /sys/devices/system/cpu/cpu0/cpufreq/phc_controls
|
||||||
|
# CAUTION: only use this, if you thoroughly understand what you are doing!
|
||||||
|
#PHC_CONTROLS="F:V F:V F:V F:V"
|
||||||
|
|
||||||
|
# Set CPU performance versus energy savings policy:
|
||||||
|
# performance, balance-performance, default, balance-power, power
|
||||||
|
# Values are given in order of increasing power saving.
|
||||||
|
CPU_ENERGY_PERF_POLICY_ON_AC=balance_performance
|
||||||
|
CPU_ENERGY_PERF_POLICY_ON_BAT=power
|
||||||
|
|
||||||
|
# Disk devices; separate multiple devices with spaces (default: sda).
|
||||||
|
# Devices can be specified by disk ID also (lookup with: tlp diskid).
|
||||||
|
DISK_DEVICES="sda sdb nvme0n1"
|
||||||
|
|
||||||
|
# Disk advanced power management level: 1..254, 255 (max saving, min, off).
|
||||||
|
# Levels 1..127 may spin down the disk; 255 allowable on most drives.
|
||||||
|
# Separate values for multiple disks with spaces. Use the special value 'keep'
|
||||||
|
# to keep the hardware default for the particular disk.
|
||||||
|
DISK_APM_LEVEL_ON_AC="254 254"
|
||||||
|
DISK_APM_LEVEL_ON_BAT="128 128"
|
||||||
|
|
||||||
|
# Hard disk spin down timeout:
|
||||||
|
# 0: spin down disabled
|
||||||
|
# 1..240: timeouts from 5s to 20min (in units of 5s)
|
||||||
|
# 241..251: timeouts from 30min to 5.5 hours (in units of 30min)
|
||||||
|
# See 'man hdparm' for details.
|
||||||
|
DISK_SPINDOWN_TIMEOUT_ON_AC="0 0"
|
||||||
|
DISK_SPINDOWN_TIMEOUT_ON_BAT="0 0"
|
||||||
|
|
||||||
|
# Select IO scheduler for the disk devices: cfq, deadline, noop (Default: cfq).
|
||||||
|
# Separate values for multiple disks with spaces. Use the special value 'keep'
|
||||||
|
# to keep the kernel default scheduler for the particular disk.
|
||||||
|
DISK_IOSCHED="mq-deadline mq-deadline"
|
||||||
|
|
||||||
|
# AHCI link power management (ALPM) for disk devices:
|
||||||
|
# min_power, med_power_with_dipm(*), medium_power, max_performance
|
||||||
|
AHCI_ALPM_ON_AC=max_performance
|
||||||
|
AHCI_ALPM_ON_BAT=min_power
|
||||||
|
|
||||||
|
# PCI Express Active State Power Management (PCIe ASPM):
|
||||||
|
# default, performance, powersave
|
||||||
|
PCIE_ASPM_ON_AC=performance
|
||||||
|
PCIE_ASPM_ON_BAT=powersave
|
||||||
|
|
||||||
|
# Radeon graphics clock speed (profile method): low, mid, high, auto, default;
|
||||||
|
# auto = mid on BAT, high on AC; default = use hardware defaults.
|
||||||
|
RADEON_POWER_PROFILE_ON_AC=high
|
||||||
|
RADEON_POWER_PROFILE_ON_BAT=low
|
||||||
|
|
||||||
|
# Radeon dynamic power management method (DPM): battery, performance
|
||||||
|
RADEON_DPM_STATE_ON_AC=performance
|
||||||
|
RADEON_DPM_STATE_ON_BAT=battery
|
||||||
|
|
||||||
|
# Radeon DPM performance level: auto, low, high; auto is recommended.
|
||||||
|
RADEON_DPM_PERF_LEVEL_ON_AC=auto
|
||||||
|
RADEON_DPM_PERF_LEVEL_ON_BAT=low
|
||||||
|
|
||||||
|
# WiFi power saving mode: on=enable, off=disable; not supported by all adapters.
|
||||||
|
WIFI_PWR_ON_AC=off
|
||||||
|
WIFI_PWR_ON_BAT=on
|
||||||
|
|
||||||
|
# Disable wake on LAN: Y/N
|
||||||
|
WOL_DISABLE=Y
|
||||||
|
|
||||||
|
# Enable audio power saving for Intel HDA, AC97 devices (timeout in secs).
|
||||||
|
# A value of 0 disables, >=1 enables power saving (recommended: 1).
|
||||||
|
SOUND_POWER_SAVE_ON_AC=0
|
||||||
|
SOUND_POWER_SAVE_ON_BAT=1
|
||||||
|
|
||||||
|
# Disable controller too (HDA only): Y/N
|
||||||
|
SOUND_POWER_SAVE_CONTROLLER=Y
|
||||||
|
|
||||||
|
# Power off optical drive in UltraBay/MediaBay: 0=disable, 1=enable.
|
||||||
|
# Drive can be powered on again by releasing (and reinserting) the eject lever
|
||||||
|
# or by pressing the disc eject button on newer models.
|
||||||
|
BAY_POWEROFF_ON_AC=0
|
||||||
|
BAY_POWEROFF_ON_BAT=0
|
||||||
|
# Optical drive device to power off (default sr0).
|
||||||
|
BAY_DEVICE="sr0"
|
||||||
|
|
||||||
|
# Runtime Power Management for AHCI host and disks devices:
|
||||||
|
# on=disable, auto=enable.
|
||||||
|
# EXPERIMENTAL: auto will most likely cause system lockups/data loss
|
||||||
|
AHCI_RUNTIME_PM_ON_AC=on
|
||||||
|
AHCI_RUNTIME_PM_ON_BAT=on
|
||||||
|
|
||||||
|
# Seconds of inactivity before disk is suspended.
|
||||||
|
AHCI_RUNTIME_PM_TIMEOUT=15
|
||||||
|
|
||||||
|
# USB autosuspend feature
|
||||||
|
USB_AUTOSUSPEND=1
|
||||||
|
|
||||||
|
# Exclude USB devices from autosuspend using device IDs (separate with spaces).
|
||||||
|
# Use lsusb to get the IDs.
|
||||||
|
# Note: input devices (mice, keyboards, etc.) are excluded automatically
|
||||||
|
#USB_BLACKLIST="1234:5678 9012:3456"
|
||||||
|
|
||||||
|
# Bluetooth devices are excluded from USB autosuspend:
|
||||||
|
# 0=do not exclude, 1=exclude
|
||||||
|
USB_BLACKLIST_BTUSB=0
|
||||||
|
|
||||||
|
# Phone devices are excluded from USB autosuspend:
|
||||||
|
# 0=do not exclude, 1=exclude (enable charging)
|
||||||
|
USB_BLACKLIST_PHONE=0
|
||||||
|
|
||||||
|
# Printers are excluded from USB autosuspend:
|
||||||
|
# 0=do not exclude, 1=exclude
|
||||||
|
USB_BLACKLIST_PRINTER=1
|
||||||
|
|
||||||
|
# WWAN devices are excluded from USB autosuspend:
|
||||||
|
# 0=do not exclude, 1=exclude
|
||||||
|
USB_BLACKLIST_WWAN=0
|
||||||
|
|
||||||
|
# Include built-in bluetooth devices in USB autosuspend:
|
||||||
|
# 0=do not include, 1=include
|
||||||
|
USB_AUTOSUSPEND_DISABLE_ON_SHUTDOWN=1
|
||||||
|
|
||||||
|
# Restore radio device state (Bluetooth, WiFi, WWAN) on system startup:
|
||||||
|
# 0=disable, 1=enable.
|
||||||
|
RESTORE_DEVICE_STATE_ON_STARTUP=0
|
||||||
|
|
||||||
|
# Radio devices to disable on startup: bluetooth, wifi, wwan.
|
||||||
|
# Separate multiple devices with spaces.
|
||||||
|
#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wifi wwan"
|
||||||
|
|
||||||
|
# Radio devices to enable on startup: bluetooth, wifi, wwan.
|
||||||
|
# Separate multiple devices with spaces.
|
||||||
|
#DEVICES_TO_ENABLE_ON_STARTUP="wifi"
|
||||||
|
|
||||||
|
# Radio devices to disable on shutdown: bluetooth, wifi, wwan.
|
||||||
|
# (workaround for devices that are blocking shutdown).
|
||||||
|
#DEVICES_TO_DISABLE_ON_SHUTDOWN="bluetooth wifi wwan"
|
||||||
|
|
||||||
|
# Radio devices to enable on shutdown: bluetooth, wifi, wwan.
|
||||||
|
# (to prevent other operating systems from missing radios).
|
||||||
|
#DEVICES_TO_ENABLE_ON_SHUTDOWN="wwan"
|
||||||
|
|
||||||
|
# Radio devices to enable on AC: bluetooth, wifi, wwan.
|
||||||
|
#DEVICES_TO_ENABLE_ON_AC="bluetooth wifi wwan"
|
||||||
|
|
||||||
|
# Radio devices to disable on battery: bluetooth, wifi, wwan.
|
||||||
|
DEVICES_TO_DISABLE_ON_BAT="bluetooth"
|
||||||
|
|
||||||
|
# Radio devices to disable on battery when not in use (not connected):
|
||||||
|
# bluetooth, wifi, wwan.
|
||||||
|
#DEVICES_TO_DISABLE_ON_BAT_NOT_IN_USE="bluetooth wifi wwan"
|
||||||
|
|
||||||
|
# Battery charge thresholds (ThinkPad only, tp-smapi or acpi-call kernel module
|
||||||
|
# required). Charging starts when the remaining capacity falls below the
|
||||||
|
# START_CHARGE_THRESH value and stops when exceeding the STOP_CHARGE_THRESH value.
|
||||||
|
# Main / Internal battery (values in %)
|
||||||
|
START_CHARGE_THRESH_BAT0=75
|
||||||
|
STOP_CHARGE_THRESH_BAT0=80
|
||||||
|
|
||||||
|
# Ultrabay / Slice / Replaceable battery (values in %)
|
||||||
|
START_CHARGE_THRESH_BAT1=75
|
||||||
|
STOP_CHARGE_THRESH_BAT1=80
|
||||||
|
|
||||||
|
# Restore charge thresholds when AC is unplugged: 0=disable, 1=enable
|
||||||
|
RESTORE_THRESHOLDS_ON_BAT=1
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# tlp-stat will print warnings for missing kernel modules and unsupported
|
||||||
|
# laptop models.
|
||||||
331
docs/powertop-guide.md
Normal file
331
docs/powertop-guide.md
Normal file
@@ -0,0 +1,331 @@
|
|||||||
|
# PowerTOP Usage Guide
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
PowerTOP is a Linux tool to diagnose issues with power consumption and power management. It provides detailed information about power usage by various system components and suggests optimizations.
|
||||||
|
|
||||||
|
## Installation Verification
|
||||||
|
|
||||||
|
After running the installation script, verify PowerTOP is installed:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check PowerTOP version
|
||||||
|
powertop --version
|
||||||
|
|
||||||
|
# Quick test (requires sudo)
|
||||||
|
sudo powertop --time=5
|
||||||
|
```
|
||||||
|
|
||||||
|
## Basic Usage
|
||||||
|
|
||||||
|
### Interactive Mode
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Launch PowerTOP in interactive mode
|
||||||
|
sudo powertop
|
||||||
|
```
|
||||||
|
|
||||||
|
**Navigation:**
|
||||||
|
- `Tab`: Switch between tabs
|
||||||
|
- `Enter`: Toggle tunables
|
||||||
|
- `q`: Quit
|
||||||
|
- Arrow keys: Navigate lists
|
||||||
|
|
||||||
|
### Tabs Overview
|
||||||
|
|
||||||
|
1. **Overview**: General system power consumption
|
||||||
|
2. **Idle stats**: CPU idle state statistics
|
||||||
|
3. **Frequency stats**: CPU frequency usage
|
||||||
|
4. **Device stats**: Individual device power usage
|
||||||
|
5. **Tunables**: Available power optimizations
|
||||||
|
|
||||||
|
## Command Line Usage
|
||||||
|
|
||||||
|
### Generate Reports
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Generate HTML report (60 seconds)
|
||||||
|
sudo powertop --html=report.html --time=60
|
||||||
|
|
||||||
|
# Generate CSV report
|
||||||
|
sudo powertop --csv=report.csv --time=60
|
||||||
|
|
||||||
|
# Custom duration
|
||||||
|
sudo powertop --html=report.html --time=120
|
||||||
|
```
|
||||||
|
|
||||||
|
### Auto-tune Mode
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Apply all available optimizations
|
||||||
|
sudo powertop --auto-tune
|
||||||
|
|
||||||
|
# View what would be changed (dry-run)
|
||||||
|
sudo powertop --auto-tune --debug
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** Auto-tune changes are temporary and reset on reboot.
|
||||||
|
|
||||||
|
## Using the PowerTOP Analysis Script
|
||||||
|
|
||||||
|
Our custom script (`scripts/powertop-analyze.sh`) provides enhanced functionality:
|
||||||
|
|
||||||
|
### Basic Report Generation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Generate 60-second HTML report
|
||||||
|
./scripts/powertop-analyze.sh
|
||||||
|
|
||||||
|
# Custom duration and format
|
||||||
|
./scripts/powertop-analyze.sh --duration 120 --format csv
|
||||||
|
|
||||||
|
# Different output directory
|
||||||
|
./scripts/powertop-analyze.sh --output /tmp/reports
|
||||||
|
```
|
||||||
|
|
||||||
|
### Apply Optimizations
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Apply PowerTOP auto-tune
|
||||||
|
./scripts/powertop-analyze.sh --auto-tune
|
||||||
|
|
||||||
|
# Quick system summary
|
||||||
|
./scripts/powertop-analyze.sh --quick
|
||||||
|
```
|
||||||
|
|
||||||
|
### View Reports
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Open latest report in browser
|
||||||
|
./scripts/powertop-analyze.sh --show-report
|
||||||
|
|
||||||
|
# List all generated reports
|
||||||
|
ls -la ~/.battery-optimizer/reports/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Understanding Reports
|
||||||
|
|
||||||
|
### HTML Report Sections
|
||||||
|
|
||||||
|
1. **System Information**
|
||||||
|
- Hardware details
|
||||||
|
- Kernel version
|
||||||
|
- System uptime
|
||||||
|
|
||||||
|
2. **Power Consumption Overview**
|
||||||
|
- Total system power draw
|
||||||
|
- Battery discharge rate
|
||||||
|
- Power source information
|
||||||
|
|
||||||
|
3. **Top Power Consumers**
|
||||||
|
- Applications using most power
|
||||||
|
- Hardware devices consuming power
|
||||||
|
- System services impact
|
||||||
|
|
||||||
|
4. **Processor Information**
|
||||||
|
- CPU frequency usage
|
||||||
|
- Idle state statistics
|
||||||
|
- Core utilization
|
||||||
|
|
||||||
|
5. **Device Power Management**
|
||||||
|
- ASPM status
|
||||||
|
- Runtime PM status
|
||||||
|
- USB autosuspend status
|
||||||
|
|
||||||
|
6. **Tunables**
|
||||||
|
- Available optimizations
|
||||||
|
- Current status (Good/Bad)
|
||||||
|
- Recommended changes
|
||||||
|
|
||||||
|
### Key Metrics to Monitor
|
||||||
|
|
||||||
|
1. **Power Consumption (Watts)**
|
||||||
|
- Lower is better
|
||||||
|
- Typical laptop: 8-15W idle, 25-45W under load
|
||||||
|
|
||||||
|
2. **Wakeups per Second**
|
||||||
|
- Lower is better for battery life
|
||||||
|
- Target: <100 wakeups/second
|
||||||
|
|
||||||
|
3. **CPU Usage**
|
||||||
|
- Identify power-hungry applications
|
||||||
|
- Background processes impact
|
||||||
|
|
||||||
|
## Optimization Categories
|
||||||
|
|
||||||
|
### CPU Optimizations
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# CPU governor (applied by TLP)
|
||||||
|
echo 'powersave' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
|
||||||
|
|
||||||
|
# CPU idle states
|
||||||
|
# Managed automatically by kernel
|
||||||
|
```
|
||||||
|
|
||||||
|
### Device Power Management
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enable ASPM (PCIe power saving)
|
||||||
|
echo 'powersave' | sudo tee /sys/module/pcie_aspm/parameters/policy
|
||||||
|
|
||||||
|
# Runtime PM for devices
|
||||||
|
echo 'auto' | sudo tee /sys/bus/pci/devices/*/power/control
|
||||||
|
```
|
||||||
|
|
||||||
|
### USB Power Management
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enable USB autosuspend
|
||||||
|
echo '1' | sudo tee /sys/module/usbcore/parameters/autosuspend
|
||||||
|
|
||||||
|
# Per-device control
|
||||||
|
echo 'auto' | sudo tee /sys/bus/usb/devices/*/power/control
|
||||||
|
```
|
||||||
|
|
||||||
|
### Audio Power Saving
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enable audio power saving
|
||||||
|
echo '1' | sudo tee /sys/module/snd_hda_intel/parameters/power_save
|
||||||
|
```
|
||||||
|
|
||||||
|
## Making Optimizations Permanent
|
||||||
|
|
||||||
|
### Method 1: Systemd Service (Recommended)
|
||||||
|
|
||||||
|
Our installation script creates a PowerTOP service:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check service status
|
||||||
|
systemctl status powertop.service
|
||||||
|
|
||||||
|
# Enable auto-tune on boot
|
||||||
|
sudo systemctl enable powertop.service
|
||||||
|
|
||||||
|
# Manually run auto-tune
|
||||||
|
sudo systemctl start powertop.service
|
||||||
|
```
|
||||||
|
|
||||||
|
### Method 2: Custom Scripts
|
||||||
|
|
||||||
|
Create startup scripts in `/etc/rc.local` or systemd services:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Example optimization script
|
||||||
|
#!/bin/bash
|
||||||
|
echo 'auto' > /sys/bus/pci/devices/*/power/control
|
||||||
|
echo 'min_power' > /sys/class/scsi_host/*/link_power_management_policy
|
||||||
|
```
|
||||||
|
|
||||||
|
### Method 3: TLP Integration
|
||||||
|
|
||||||
|
Most PowerTOP optimizations are already included in our TLP configuration.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
1. **PowerTOP requires root privileges**
|
||||||
|
- This is normal for hardware access
|
||||||
|
- Always use `sudo powertop`
|
||||||
|
|
||||||
|
2. **No power consumption data**
|
||||||
|
- Check if running on battery
|
||||||
|
- Ensure ACPI support in kernel
|
||||||
|
- Some virtual machines don't report power data
|
||||||
|
|
||||||
|
3. **Optimizations not persisting**
|
||||||
|
- Use systemd service for permanent changes
|
||||||
|
- Check for conflicting power managers
|
||||||
|
|
||||||
|
### Debug Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check kernel power management support
|
||||||
|
ls /sys/class/power_supply/
|
||||||
|
|
||||||
|
# Verify ACPI tables
|
||||||
|
sudo acpidump | head -20
|
||||||
|
|
||||||
|
# Check for power management conflicts
|
||||||
|
systemctl list-units | grep power
|
||||||
|
```
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
### Regular Monitoring
|
||||||
|
|
||||||
|
1. **Weekly Reports**: Generate PowerTOP reports to track trends
|
||||||
|
2. **Before/After Testing**: Measure impact of configuration changes
|
||||||
|
3. **Application Profiling**: Identify power-hungry applications
|
||||||
|
|
||||||
|
### Analysis Workflow
|
||||||
|
|
||||||
|
1. **Baseline Measurement**: Record power consumption before changes
|
||||||
|
2. **Apply Optimizations**: Use systematic approach
|
||||||
|
3. **Measure Impact**: Generate new reports
|
||||||
|
4. **Document Changes**: Keep track of what works
|
||||||
|
|
||||||
|
### Report Interpretation
|
||||||
|
|
||||||
|
1. **Focus on Top Consumers**: Address highest impact items first
|
||||||
|
2. **Check Tunables**: Apply "Bad" recommendations carefully
|
||||||
|
3. **Monitor Trends**: Look for patterns over time
|
||||||
|
4. **Validate Changes**: Ensure functionality isn't compromised
|
||||||
|
|
||||||
|
## Integration with Other Tools
|
||||||
|
|
||||||
|
### With TLP
|
||||||
|
|
||||||
|
PowerTOP and TLP complement each other:
|
||||||
|
- TLP: Provides systematic, persistent power management
|
||||||
|
- PowerTOP: Offers detailed analysis and additional optimizations
|
||||||
|
|
||||||
|
### With System Monitoring
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Combine with system monitoring
|
||||||
|
./scripts/powertop-analyze.sh &
|
||||||
|
./scripts/battery-monitor.sh --watch
|
||||||
|
```
|
||||||
|
|
||||||
|
### With Performance Tools
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Monitor performance impact
|
||||||
|
htop &
|
||||||
|
sudo powertop --auto-tune
|
||||||
|
# Check if system remains responsive
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Usage
|
||||||
|
|
||||||
|
### Automated Analysis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# Daily power analysis script
|
||||||
|
DATE=$(date +%Y%m%d)
|
||||||
|
sudo powertop --html=/var/log/powertop_${DATE}.html --time=3600
|
||||||
|
|
||||||
|
# Email report or upload to monitoring system
|
||||||
|
```
|
||||||
|
|
||||||
|
### Custom Reporting
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Extract specific data from CSV reports
|
||||||
|
awk -F',' 'NR>1 {print $1,$3}' report.csv | sort -k2 -nr | head -10
|
||||||
|
```
|
||||||
|
|
||||||
|
### Integration with Monitoring Systems
|
||||||
|
|
||||||
|
PowerTOP data can be integrated with:
|
||||||
|
- Grafana dashboards
|
||||||
|
- Nagios monitoring
|
||||||
|
- Custom logging systems
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
This guide should be used alongside the PowerTOP analysis script provided in this repository for optimal power management.
|
||||||
280
docs/tlp-configuration.md
Normal file
280
docs/tlp-configuration.md
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
# TLP Configuration Guide
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
TLP (Linux Advanced Power Management) is a feature-rich command line utility for optimizing battery life on Linux laptops. This guide explains the key configuration options and their impact on battery performance.
|
||||||
|
|
||||||
|
## Configuration File Location
|
||||||
|
|
||||||
|
The main configuration file is located at:
|
||||||
|
- `/etc/tlp.conf` (system-wide configuration)
|
||||||
|
- Backup copies are created as `/etc/tlp.conf.backup.YYYYMMDD_HHMMSS`
|
||||||
|
|
||||||
|
## Key Configuration Sections
|
||||||
|
|
||||||
|
### 1. Operation Modes
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Default operation mode
|
||||||
|
TLP_DEFAULT_MODE=BAT
|
||||||
|
|
||||||
|
# Use persistent mode for consistent behavior
|
||||||
|
TLP_PERSISTENT_DEFAULT=0
|
||||||
|
```
|
||||||
|
|
||||||
|
**Explanation:**
|
||||||
|
- `BAT`: Optimizes for battery life
|
||||||
|
- `AC`: Optimizes for AC power (performance)
|
||||||
|
- `DEF`: Uses kernel defaults
|
||||||
|
|
||||||
|
### 2. CPU Power Management
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# CPU frequency governor
|
||||||
|
CPU_SCALING_GOVERNOR_ON_AC=powersave
|
||||||
|
CPU_SCALING_GOVERNOR_ON_BAT=powersave
|
||||||
|
|
||||||
|
# CPU frequency limits
|
||||||
|
CPU_SCALING_MIN_FREQ_ON_BAT=800000
|
||||||
|
CPU_SCALING_MAX_FREQ_ON_BAT=1600000
|
||||||
|
|
||||||
|
# Intel P-state settings
|
||||||
|
CPU_HWP_ON_BAT=power
|
||||||
|
CPU_MAX_PERF_ON_BAT=50
|
||||||
|
CPU_BOOST_ON_BAT=0
|
||||||
|
```
|
||||||
|
|
||||||
|
**Impact:**
|
||||||
|
- Reduces CPU power consumption by 20-40%
|
||||||
|
- May slightly reduce performance under heavy loads
|
||||||
|
- Automatic scaling based on demand
|
||||||
|
|
||||||
|
### 3. Disk Power Management
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Advanced Power Management levels
|
||||||
|
DISK_APM_LEVEL_ON_BAT="128 128"
|
||||||
|
|
||||||
|
# IO scheduler optimization
|
||||||
|
DISK_IOSCHED="mq-deadline mq-deadline"
|
||||||
|
|
||||||
|
# AHCI Link Power Management
|
||||||
|
AHCI_ALPM_ON_BAT=min_power
|
||||||
|
```
|
||||||
|
|
||||||
|
**Impact:**
|
||||||
|
- Reduces disk power consumption
|
||||||
|
- May increase disk access latency slightly
|
||||||
|
- Significant savings for HDDs, moderate for SSDs
|
||||||
|
|
||||||
|
### 4. Graphics Power Management
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Radeon settings (for AMD GPUs)
|
||||||
|
RADEON_POWER_PROFILE_ON_BAT=low
|
||||||
|
RADEON_DPM_STATE_ON_BAT=battery
|
||||||
|
|
||||||
|
# Intel graphics automatically managed
|
||||||
|
```
|
||||||
|
|
||||||
|
**Impact:**
|
||||||
|
- Reduces GPU power consumption by 15-30%
|
||||||
|
- Lower graphics performance in games/3D applications
|
||||||
|
- Minimal impact on desktop usage
|
||||||
|
|
||||||
|
### 5. Wireless Device Management
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# WiFi power saving
|
||||||
|
WIFI_PWR_ON_BAT=on
|
||||||
|
|
||||||
|
# Bluetooth management
|
||||||
|
DEVICES_TO_DISABLE_ON_BAT="bluetooth"
|
||||||
|
|
||||||
|
# Wake on LAN
|
||||||
|
WOL_DISABLE=Y
|
||||||
|
```
|
||||||
|
|
||||||
|
**Impact:**
|
||||||
|
- Reduces wireless power consumption
|
||||||
|
- May affect network performance slightly
|
||||||
|
- Automatic reconnection when needed
|
||||||
|
|
||||||
|
### 6. USB Power Management
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enable USB autosuspend
|
||||||
|
USB_AUTOSUSPEND=1
|
||||||
|
|
||||||
|
# Exclude critical devices
|
||||||
|
USB_BLACKLIST_PRINTER=1
|
||||||
|
USB_BLACKLIST_PHONE=0
|
||||||
|
```
|
||||||
|
|
||||||
|
**Impact:**
|
||||||
|
- Suspends unused USB devices
|
||||||
|
- Saves 0.5-2W per device
|
||||||
|
- Blacklist prevents issues with specific devices
|
||||||
|
|
||||||
|
### 7. Battery Charge Thresholds (ThinkPad)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start charging at 75%
|
||||||
|
START_CHARGE_THRESH_BAT0=75
|
||||||
|
|
||||||
|
# Stop charging at 80%
|
||||||
|
STOP_CHARGE_THRESH_BAT0=80
|
||||||
|
```
|
||||||
|
|
||||||
|
**Impact:**
|
||||||
|
- Extends battery lifespan significantly
|
||||||
|
- Reduces available capacity slightly
|
||||||
|
- Optimal for plugged-in usage
|
||||||
|
|
||||||
|
## Advanced Optimizations
|
||||||
|
|
||||||
|
### CPU Undervolting
|
||||||
|
|
||||||
|
For advanced users, CPU undervolting can provide additional power savings:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# EXPERIMENTAL - Use with caution
|
||||||
|
# PHC_CONTROLS="F:V F:V F:V F:V"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Warning:** Only use if you understand the risks. Incorrect values can cause system instability.
|
||||||
|
|
||||||
|
### Custom Scripts
|
||||||
|
|
||||||
|
You can add custom power management commands to:
|
||||||
|
- `/etc/tlp.d/` - Additional configuration files
|
||||||
|
- Systemd services for startup optimizations
|
||||||
|
|
||||||
|
## Monitoring Configuration Impact
|
||||||
|
|
||||||
|
### Check Current Settings
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Show all TLP settings
|
||||||
|
sudo tlp-stat
|
||||||
|
|
||||||
|
# Show specific components
|
||||||
|
sudo tlp-stat -p # Processor
|
||||||
|
sudo tlp-stat -d # Disks
|
||||||
|
sudo tlp-stat -g # Graphics
|
||||||
|
sudo tlp-stat -u # USB
|
||||||
|
```
|
||||||
|
|
||||||
|
### Measure Power Consumption
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Before configuration changes
|
||||||
|
sudo powertop --time=60
|
||||||
|
|
||||||
|
# Apply changes
|
||||||
|
sudo tlp start
|
||||||
|
|
||||||
|
# After configuration changes
|
||||||
|
sudo powertop --time=60
|
||||||
|
```
|
||||||
|
|
||||||
|
## Distribution-Specific Notes
|
||||||
|
|
||||||
|
### Ubuntu/Debian
|
||||||
|
- Install with: `sudo apt install tlp tlp-rdw`
|
||||||
|
- May conflict with `power-profiles-daemon`
|
||||||
|
|
||||||
|
### Fedora/RHEL
|
||||||
|
- Install with: `sudo dnf install tlp tlp-rdw`
|
||||||
|
- Disable conflicting services
|
||||||
|
|
||||||
|
### Arch Linux
|
||||||
|
- Install with: `sudo pacman -S tlp`
|
||||||
|
- Enable service: `sudo systemctl enable tlp.service`
|
||||||
|
|
||||||
|
## Laptop-Specific Optimizations
|
||||||
|
|
||||||
|
### ThinkPad
|
||||||
|
- Install additional tools: `tp-smapi-dkms acpi-call-dkms`
|
||||||
|
- Battery threshold support available
|
||||||
|
- Enhanced fan control
|
||||||
|
|
||||||
|
### Dell
|
||||||
|
- Use `i8kutils` for fan control
|
||||||
|
- BIOS settings may override some options
|
||||||
|
|
||||||
|
### HP
|
||||||
|
- Limited hardware support
|
||||||
|
- Focus on software optimizations
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
1. **TLP not applying settings**
|
||||||
|
```bash
|
||||||
|
sudo systemctl enable tlp.service
|
||||||
|
sudo systemctl start tlp.service
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Settings reset after reboot**
|
||||||
|
- Check if other power managers are active
|
||||||
|
- Ensure TLP service is enabled
|
||||||
|
|
||||||
|
3. **USB devices not working**
|
||||||
|
- Add device IDs to blacklist
|
||||||
|
- Check `lsusb` output for device identification
|
||||||
|
|
||||||
|
### Verification Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check TLP service status
|
||||||
|
systemctl status tlp.service
|
||||||
|
|
||||||
|
# Verify configuration syntax
|
||||||
|
sudo tlp-stat -c
|
||||||
|
|
||||||
|
# Test specific settings
|
||||||
|
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance vs Battery Life
|
||||||
|
|
||||||
|
### Maximum Battery Life Profile
|
||||||
|
- All power saving features enabled
|
||||||
|
- Significant performance reduction acceptable
|
||||||
|
- Target: 30-50% longer battery life
|
||||||
|
|
||||||
|
### Balanced Profile
|
||||||
|
- Moderate power saving
|
||||||
|
- Minimal performance impact
|
||||||
|
- Target: 15-25% longer battery life
|
||||||
|
|
||||||
|
### Performance Profile
|
||||||
|
- Limited power saving
|
||||||
|
- Maximum performance preserved
|
||||||
|
- Target: 5-10% longer battery life
|
||||||
|
|
||||||
|
## Regular Maintenance
|
||||||
|
|
||||||
|
### Monthly Tasks
|
||||||
|
- Review power consumption reports
|
||||||
|
- Check battery health
|
||||||
|
- Update TLP configuration if needed
|
||||||
|
|
||||||
|
### After System Updates
|
||||||
|
- Verify TLP service is still running
|
||||||
|
- Check for configuration file changes
|
||||||
|
- Test critical functionality
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Start Conservative**: Begin with moderate settings and adjust gradually
|
||||||
|
2. **Monitor Impact**: Use PowerTOP to measure actual improvements
|
||||||
|
3. **Document Changes**: Keep track of modifications for troubleshooting
|
||||||
|
4. **Test Thoroughly**: Verify all hardware functions correctly
|
||||||
|
5. **Regular Updates**: Keep TLP and related tools current
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
This configuration guide should be used alongside the main installation and monitoring tools provided in this repository.
|
||||||
227
scripts/battery-monitor.sh
Executable file
227
scripts/battery-monitor.sh
Executable file
@@ -0,0 +1,227 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Battery Status Monitor
|
||||||
|
# Displays detailed battery information and power consumption
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Function to print header
|
||||||
|
print_header() {
|
||||||
|
echo -e "${BLUE}=================================================${NC}"
|
||||||
|
echo -e "${BLUE} Battery Status Monitor${NC}"
|
||||||
|
echo -e "${BLUE}=================================================${NC}"
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to get battery information
|
||||||
|
get_battery_info() {
|
||||||
|
local bat_path="/sys/class/power_supply"
|
||||||
|
local ac_path="/sys/class/power_supply/A[CD]*"
|
||||||
|
|
||||||
|
echo -e "${CYAN}Battery Information:${NC}"
|
||||||
|
echo "----------------------------------------"
|
||||||
|
|
||||||
|
# Find all batteries
|
||||||
|
for battery in "$bat_path"/BAT*; do
|
||||||
|
if [[ -d "$battery" ]]; then
|
||||||
|
local bat_name=$(basename "$battery")
|
||||||
|
local capacity=$(cat "$battery/capacity" 2>/dev/null || echo "N/A")
|
||||||
|
local status=$(cat "$battery/status" 2>/dev/null || echo "N/A")
|
||||||
|
local voltage=$(cat "$battery/voltage_now" 2>/dev/null || echo "0")
|
||||||
|
local current=$(cat "$battery/current_now" 2>/dev/null || echo "0")
|
||||||
|
local energy_full=$(cat "$battery/energy_full" 2>/dev/null || echo "0")
|
||||||
|
local energy_now=$(cat "$battery/energy_now" 2>/dev/null || echo "0")
|
||||||
|
local power_now=$(cat "$battery/power_now" 2>/dev/null || echo "0")
|
||||||
|
|
||||||
|
# Convert values to human readable format
|
||||||
|
voltage_v=$(echo "scale=2; $voltage / 1000000" | bc -l 2>/dev/null || echo "0")
|
||||||
|
current_a=$(echo "scale=2; $current / 1000000" | bc -l 2>/dev/null || echo "0")
|
||||||
|
energy_full_wh=$(echo "scale=2; $energy_full / 1000000" | bc -l 2>/dev/null || echo "0")
|
||||||
|
energy_now_wh=$(echo "scale=2; $energy_now / 1000000" | bc -l 2>/dev/null || echo "0")
|
||||||
|
power_w=$(echo "scale=2; $power_now / 1000000" | bc -l 2>/dev/null || echo "0")
|
||||||
|
|
||||||
|
# Color code based on battery level
|
||||||
|
if (( $(echo "$capacity >= 80" | bc -l) )); then
|
||||||
|
color=$GREEN
|
||||||
|
elif (( $(echo "$capacity >= 50" | bc -l) )); then
|
||||||
|
color=$YELLOW
|
||||||
|
else
|
||||||
|
color=$RED
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${BLUE}$bat_name:${NC}"
|
||||||
|
echo -e " Capacity: ${color}${capacity}%${NC}"
|
||||||
|
echo -e " Status: $status"
|
||||||
|
echo -e " Voltage: ${voltage_v}V"
|
||||||
|
echo -e " Current: ${current_a}A"
|
||||||
|
echo -e " Power: ${power_w}W"
|
||||||
|
echo -e " Energy: ${energy_now_wh}Wh / ${energy_full_wh}Wh"
|
||||||
|
|
||||||
|
# Calculate remaining time
|
||||||
|
if [[ "$status" == "Discharging" ]] && (( $(echo "$power_w > 0" | bc -l) )); then
|
||||||
|
remaining_hours=$(echo "scale=2; $energy_now_wh / $power_w" | bc -l)
|
||||||
|
remaining_minutes=$(echo "scale=0; $remaining_hours * 60" | bc -l)
|
||||||
|
hours=$(echo "scale=0; $remaining_minutes / 60" | bc -l)
|
||||||
|
minutes=$(echo "scale=0; $remaining_minutes % 60" | bc -l)
|
||||||
|
echo -e " Time left: ${hours}h ${minutes}m"
|
||||||
|
elif [[ "$status" == "Charging" ]] && (( $(echo "$power_w > 0" | bc -l) )); then
|
||||||
|
charge_needed=$(echo "scale=2; $energy_full_wh - $energy_now_wh" | bc -l)
|
||||||
|
charge_time=$(echo "scale=2; $charge_needed / $power_w" | bc -l)
|
||||||
|
charge_minutes=$(echo "scale=0; $charge_time * 60" | bc -l)
|
||||||
|
charge_hours=$(echo "scale=0; $charge_minutes / 60" | bc -l)
|
||||||
|
charge_mins=$(echo "scale=0; $charge_minutes % 60" | bc -l)
|
||||||
|
echo -e " Time to full: ${charge_hours}h ${charge_mins}m"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check AC adapter status
|
||||||
|
for ac in $ac_path; do
|
||||||
|
if [[ -d "$ac" ]] 2>/dev/null; then
|
||||||
|
local ac_name=$(basename "$ac")
|
||||||
|
local ac_online=$(cat "$ac/online" 2>/dev/null || echo "0")
|
||||||
|
if [[ "$ac_online" == "1" ]]; then
|
||||||
|
echo -e "AC Adapter: ${GREEN}Connected${NC}"
|
||||||
|
else
|
||||||
|
echo -e "AC Adapter: ${RED}Disconnected${NC}"
|
||||||
|
fi
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show TLP status
|
||||||
|
show_tlp_status() {
|
||||||
|
if command -v tlp-stat &> /dev/null; then
|
||||||
|
echo -e "${CYAN}TLP Status:${NC}"
|
||||||
|
echo "----------------------------------------"
|
||||||
|
tlp-stat -s 2>/dev/null | head -10
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show power consumption
|
||||||
|
show_power_consumption() {
|
||||||
|
echo -e "${CYAN}Power Consumption:${NC}"
|
||||||
|
echo "----------------------------------------"
|
||||||
|
|
||||||
|
# Try to get power consumption from various sources
|
||||||
|
local power_consumption=""
|
||||||
|
|
||||||
|
# Method 1: From battery power_now
|
||||||
|
for battery in /sys/class/power_supply/BAT*; do
|
||||||
|
if [[ -d "$battery" ]]; then
|
||||||
|
local power_now=$(cat "$battery/power_now" 2>/dev/null || echo "0")
|
||||||
|
if [[ "$power_now" != "0" ]]; then
|
||||||
|
power_w=$(echo "scale=2; $power_now / 1000000" | bc -l)
|
||||||
|
power_consumption="$power_w"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -n "$power_consumption" ]]; then
|
||||||
|
echo -e "Current draw: ${power_consumption}W"
|
||||||
|
else
|
||||||
|
echo "Power consumption data not available"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# CPU frequency information
|
||||||
|
if [[ -f /proc/cpuinfo ]]; then
|
||||||
|
local cpu_freq=$(cat /proc/cpuinfo | grep "cpu MHz" | head -1 | awk '{print $4}')
|
||||||
|
if [[ -n "$cpu_freq" ]]; then
|
||||||
|
echo -e "CPU frequency: ${cpu_freq} MHz"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Load average
|
||||||
|
local load_avg=$(cat /proc/loadavg | awk '{print $1, $2, $3}')
|
||||||
|
echo -e "Load average: $load_avg"
|
||||||
|
|
||||||
|
# Temperature (if available)
|
||||||
|
if command -v sensors &> /dev/null; then
|
||||||
|
local temp=$(sensors | grep "Core 0" | awk '{print $3}' | head -1)
|
||||||
|
if [[ -n "$temp" ]]; then
|
||||||
|
echo -e "CPU temperature: $temp"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show system uptime and power efficiency
|
||||||
|
show_efficiency() {
|
||||||
|
echo -e "${CYAN}System Efficiency:${NC}"
|
||||||
|
echo "----------------------------------------"
|
||||||
|
|
||||||
|
# Uptime
|
||||||
|
local uptime_info=$(uptime -p)
|
||||||
|
echo -e "Uptime: $uptime_info"
|
||||||
|
|
||||||
|
# Memory usage
|
||||||
|
local mem_info=$(free -h | grep "Mem:" | awk '{print "Used: " $3 " / " $2}')
|
||||||
|
echo -e "Memory: $mem_info"
|
||||||
|
|
||||||
|
# Disk activity
|
||||||
|
if command -v iostat &> /dev/null; then
|
||||||
|
local disk_usage=$(iostat -d 1 2 | tail -n +4 | head -1 | awk '{print $4 + $5}')
|
||||||
|
echo -e "Disk I/O: ${disk_usage} KB/s"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to provide power saving tips
|
||||||
|
show_tips() {
|
||||||
|
echo -e "${CYAN}Power Saving Tips:${NC}"
|
||||||
|
echo "----------------------------------------"
|
||||||
|
echo "• Lower screen brightness"
|
||||||
|
echo "• Close unused applications"
|
||||||
|
echo "• Disable unused wireless devices"
|
||||||
|
echo "• Use power saving mode"
|
||||||
|
echo "• Enable TLP and PowerTOP optimizations"
|
||||||
|
echo "• Consider using an SSD instead of HDD"
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main function
|
||||||
|
main() {
|
||||||
|
# Check if bc is available for calculations
|
||||||
|
if ! command -v bc &> /dev/null; then
|
||||||
|
echo "Installing bc for calculations..."
|
||||||
|
sudo apt update && sudo apt install -y bc
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clear screen and show header
|
||||||
|
clear
|
||||||
|
print_header
|
||||||
|
|
||||||
|
# Show all information
|
||||||
|
get_battery_info
|
||||||
|
show_tlp_status
|
||||||
|
show_power_consumption
|
||||||
|
show_efficiency
|
||||||
|
show_tips
|
||||||
|
|
||||||
|
echo -e "${BLUE}Last updated: $(date)${NC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Watch mode - refresh every 5 seconds
|
||||||
|
if [[ "${1:-}" == "--watch" ]]; then
|
||||||
|
while true; do
|
||||||
|
main
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
else
|
||||||
|
main
|
||||||
|
fi
|
||||||
198
scripts/install.sh
Executable file
198
scripts/install.sh
Executable file
@@ -0,0 +1,198 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Battery Life Optimizer - TLP and PowerTOP Installation Script
|
||||||
|
# For Debian/Ubuntu-based Linux distributions
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Logging function
|
||||||
|
log() {
|
||||||
|
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
warning() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if running as root
|
||||||
|
check_root() {
|
||||||
|
if [[ $EUID -eq 0 ]]; then
|
||||||
|
error "This script should not be run as root!"
|
||||||
|
error "It will use sudo when necessary."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if system is supported
|
||||||
|
check_system() {
|
||||||
|
if [[ ! -f /etc/debian_version ]] && [[ ! -f /etc/ubuntu_version ]]; then
|
||||||
|
warning "This script is optimized for Debian/Ubuntu systems."
|
||||||
|
read -p "Continue anyway? (y/N): " -n 1 -r
|
||||||
|
echo
|
||||||
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Update package lists
|
||||||
|
update_packages() {
|
||||||
|
log "Updating package lists..."
|
||||||
|
sudo apt update
|
||||||
|
success "Package lists updated"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install TLP
|
||||||
|
install_tlp() {
|
||||||
|
log "Installing TLP (Advanced Power Management)..."
|
||||||
|
|
||||||
|
# Check if TLP is already installed
|
||||||
|
if command -v tlp &> /dev/null; then
|
||||||
|
warning "TLP is already installed"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install TLP and additional packages
|
||||||
|
sudo apt install -y tlp tlp-rdw
|
||||||
|
|
||||||
|
# For ThinkPads, install additional tools
|
||||||
|
if dmidecode -s system-product-name | grep -qi "thinkpad"; then
|
||||||
|
log "ThinkPad detected, installing additional tools..."
|
||||||
|
sudo apt install -y tp-smapi-dkms acpi-call-dkms
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Enable and start TLP service
|
||||||
|
sudo systemctl enable tlp.service
|
||||||
|
sudo systemctl start tlp.service
|
||||||
|
|
||||||
|
success "TLP installed and configured"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install PowerTOP
|
||||||
|
install_powertop() {
|
||||||
|
log "Installing PowerTOP..."
|
||||||
|
|
||||||
|
# Check if PowerTOP is already installed
|
||||||
|
if command -v powertop &> /dev/null; then
|
||||||
|
warning "PowerTOP is already installed"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
sudo apt install -y powertop
|
||||||
|
|
||||||
|
success "PowerTOP installed"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Setup PowerTOP service for automatic tuning
|
||||||
|
setup_powertop_service() {
|
||||||
|
log "Setting up PowerTOP auto-tune service..."
|
||||||
|
|
||||||
|
# Create systemd service file for PowerTOP
|
||||||
|
sudo tee /etc/systemd/system/powertop.service > /dev/null <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=PowerTOP auto tune
|
||||||
|
After=multi-user.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/sbin/powertop --auto-tune
|
||||||
|
RemainAfterExit=true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Enable the service
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl enable powertop.service
|
||||||
|
|
||||||
|
success "PowerTOP auto-tune service configured"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Backup existing TLP configuration
|
||||||
|
backup_tlp_config() {
|
||||||
|
local tlp_config="/etc/tlp.conf"
|
||||||
|
local backup_file="/etc/tlp.conf.backup.$(date +%Y%m%d_%H%M%S)"
|
||||||
|
|
||||||
|
if [[ -f "$tlp_config" ]]; then
|
||||||
|
log "Backing up existing TLP configuration..."
|
||||||
|
sudo cp "$tlp_config" "$backup_file"
|
||||||
|
success "TLP configuration backed up to $backup_file"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Apply optimized TLP configuration
|
||||||
|
apply_tlp_config() {
|
||||||
|
log "Applying optimized TLP configuration..."
|
||||||
|
|
||||||
|
local config_file="../config/tlp.conf"
|
||||||
|
if [[ -f "$config_file" ]]; then
|
||||||
|
sudo cp "$config_file" /etc/tlp.conf
|
||||||
|
success "TLP configuration applied"
|
||||||
|
else
|
||||||
|
warning "Optimized TLP config file not found. Using default configuration."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install additional power management tools
|
||||||
|
install_additional_tools() {
|
||||||
|
log "Installing additional power management tools..."
|
||||||
|
|
||||||
|
sudo apt install -y \
|
||||||
|
laptop-mode-tools \
|
||||||
|
thermald \
|
||||||
|
cpufrequtils \
|
||||||
|
smartmontools \
|
||||||
|
ethtool
|
||||||
|
|
||||||
|
success "Additional tools installed"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main installation function
|
||||||
|
main() {
|
||||||
|
log "Starting Battery Life Optimizer installation..."
|
||||||
|
|
||||||
|
check_root
|
||||||
|
check_system
|
||||||
|
|
||||||
|
update_packages
|
||||||
|
install_tlp
|
||||||
|
install_powertop
|
||||||
|
setup_powertop_service
|
||||||
|
install_additional_tools
|
||||||
|
|
||||||
|
backup_tlp_config
|
||||||
|
apply_tlp_config
|
||||||
|
|
||||||
|
# Start TLP
|
||||||
|
log "Starting TLP service..."
|
||||||
|
sudo tlp start
|
||||||
|
|
||||||
|
success "Installation completed successfully!"
|
||||||
|
echo
|
||||||
|
log "Next steps:"
|
||||||
|
echo "1. Run 'tlp-stat' to check TLP status"
|
||||||
|
echo "2. Run 'sudo powertop' to analyze power consumption"
|
||||||
|
echo "3. Reboot your system for all changes to take effect"
|
||||||
|
echo "4. Use the monitoring scripts in the scripts/ directory"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run main function if script is executed directly
|
||||||
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||||
|
main "$@"
|
||||||
|
fi
|
||||||
262
scripts/powertop-analyze.sh
Executable file
262
scripts/powertop-analyze.sh
Executable file
@@ -0,0 +1,262 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# PowerTOP Analysis Tool
|
||||||
|
# Generates detailed power consumption reports and recommendations
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Default values
|
||||||
|
REPORT_DIR="$HOME/.battery-optimizer/reports"
|
||||||
|
DURATION=60
|
||||||
|
OUTPUT_FORMAT="html"
|
||||||
|
|
||||||
|
# Function to show usage
|
||||||
|
show_usage() {
|
||||||
|
echo "PowerTOP Analysis Tool"
|
||||||
|
echo
|
||||||
|
echo "Usage: $0 [OPTIONS]"
|
||||||
|
echo
|
||||||
|
echo "Options:"
|
||||||
|
echo " -d, --duration SECONDS Analysis duration in seconds (default: 60)"
|
||||||
|
echo " -o, --output DIR Output directory (default: ~/.battery-optimizer/reports)"
|
||||||
|
echo " -f, --format FORMAT Output format: html, csv, txt (default: html)"
|
||||||
|
echo " -a, --auto-tune Apply PowerTOP auto-tune (requires sudo)"
|
||||||
|
echo " -s, --show-report Show latest report in browser"
|
||||||
|
echo " -h, --help Show this help message"
|
||||||
|
echo
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 Generate 60-second report"
|
||||||
|
echo " $0 -d 120 -f html Generate 2-minute HTML report"
|
||||||
|
echo " $0 -a Apply auto-tune optimizations"
|
||||||
|
echo " $0 -s Show latest report"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to check dependencies
|
||||||
|
check_dependencies() {
|
||||||
|
if ! command -v powertop &> /dev/null; then
|
||||||
|
echo -e "${RED}Error: PowerTOP is not installed${NC}"
|
||||||
|
echo "Please run the installation script first: ./scripts/install.sh"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to create report directory
|
||||||
|
create_report_dir() {
|
||||||
|
if [[ ! -d "$REPORT_DIR" ]]; then
|
||||||
|
mkdir -p "$REPORT_DIR"
|
||||||
|
echo -e "${GREEN}Created report directory: $REPORT_DIR${NC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to run PowerTOP analysis
|
||||||
|
run_analysis() {
|
||||||
|
local duration=$1
|
||||||
|
local output_file="$2"
|
||||||
|
|
||||||
|
echo -e "${BLUE}Running PowerTOP analysis for $duration seconds...${NC}"
|
||||||
|
echo "This requires sudo privileges for hardware access."
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Create a temporary file for PowerTOP output
|
||||||
|
local temp_file=$(mktemp)
|
||||||
|
|
||||||
|
case "$OUTPUT_FORMAT" in
|
||||||
|
"html")
|
||||||
|
sudo powertop --html="$output_file" --time="$duration"
|
||||||
|
;;
|
||||||
|
"csv")
|
||||||
|
sudo powertop --csv="$output_file" --time="$duration"
|
||||||
|
;;
|
||||||
|
"txt")
|
||||||
|
sudo powertop --time="$duration" > "$temp_file" 2>&1
|
||||||
|
cp "$temp_file" "$output_file"
|
||||||
|
rm "$temp_file"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ -f "$output_file" ]]; then
|
||||||
|
echo -e "${GREEN}Analysis complete! Report saved to: $output_file${NC}"
|
||||||
|
|
||||||
|
# Show file size
|
||||||
|
local file_size=$(du -h "$output_file" | cut -f1)
|
||||||
|
echo -e "${CYAN}Report size: $file_size${NC}"
|
||||||
|
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo -e "${RED}Error: Failed to generate report${NC}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to apply auto-tune
|
||||||
|
apply_auto_tune() {
|
||||||
|
echo -e "${YELLOW}Applying PowerTOP auto-tune optimizations...${NC}"
|
||||||
|
echo "This will modify system power settings."
|
||||||
|
|
||||||
|
read -p "Continue? (y/N): " -n 1 -r
|
||||||
|
echo
|
||||||
|
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
sudo powertop --auto-tune
|
||||||
|
echo -e "${GREEN}Auto-tune applied successfully${NC}"
|
||||||
|
echo "Note: These settings are temporary and will reset on reboot"
|
||||||
|
echo "To make them permanent, consider adding them to startup scripts"
|
||||||
|
else
|
||||||
|
echo "Auto-tune cancelled"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show latest report
|
||||||
|
show_latest_report() {
|
||||||
|
local latest_html=$(find "$REPORT_DIR" -name "*.html" -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-)
|
||||||
|
|
||||||
|
if [[ -n "$latest_html" && -f "$latest_html" ]]; then
|
||||||
|
echo -e "${GREEN}Opening latest report: $latest_html${NC}"
|
||||||
|
|
||||||
|
# Try different browsers
|
||||||
|
if command -v xdg-open &> /dev/null; then
|
||||||
|
xdg-open "$latest_html"
|
||||||
|
elif command -v firefox &> /dev/null; then
|
||||||
|
firefox "$latest_html" &
|
||||||
|
elif command -v chromium &> /dev/null; then
|
||||||
|
chromium "$latest_html" &
|
||||||
|
elif command -v google-chrome &> /dev/null; then
|
||||||
|
google-chrome "$latest_html" &
|
||||||
|
else
|
||||||
|
echo "No suitable browser found. Please open manually:"
|
||||||
|
echo "$latest_html"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}No HTML reports found in $REPORT_DIR${NC}"
|
||||||
|
echo "Generate a report first with: $0 -f html"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show quick summary
|
||||||
|
show_quick_summary() {
|
||||||
|
echo -e "${CYAN}Quick PowerTOP Summary:${NC}"
|
||||||
|
echo "----------------------------------------"
|
||||||
|
|
||||||
|
# Show current power consumption estimate
|
||||||
|
sudo powertop --time=1 2>/dev/null | grep -E "(The battery reports|Wh)" | head -5
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo -e "${CYAN}Top power consumers (run full analysis for details):${NC}"
|
||||||
|
sudo powertop --time=1 2>/dev/null | grep -A 10 "Top 10 power consumers" | tail -10
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to generate filename
|
||||||
|
generate_filename() {
|
||||||
|
local timestamp=$(date +"%Y%m%d_%H%M%S")
|
||||||
|
local hostname=$(hostname -s)
|
||||||
|
echo "powertop_${hostname}_${timestamp}.${OUTPUT_FORMAT}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main function
|
||||||
|
main() {
|
||||||
|
local auto_tune=false
|
||||||
|
local show_report=false
|
||||||
|
local quick_summary=false
|
||||||
|
|
||||||
|
# Parse command line arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
-d|--duration)
|
||||||
|
DURATION="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-o|--output)
|
||||||
|
REPORT_DIR="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-f|--format)
|
||||||
|
OUTPUT_FORMAT="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-a|--auto-tune)
|
||||||
|
auto_tune=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-s|--show-report)
|
||||||
|
show_report=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-q|--quick)
|
||||||
|
quick_summary=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
show_usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option: $1"
|
||||||
|
show_usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Validate format
|
||||||
|
if [[ ! "$OUTPUT_FORMAT" =~ ^(html|csv|txt)$ ]]; then
|
||||||
|
echo -e "${RED}Error: Invalid output format '$OUTPUT_FORMAT'${NC}"
|
||||||
|
echo "Supported formats: html, csv, txt"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check dependencies
|
||||||
|
check_dependencies
|
||||||
|
|
||||||
|
# Handle special actions
|
||||||
|
if [[ "$show_report" == true ]]; then
|
||||||
|
show_latest_report
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$auto_tune" == true ]]; then
|
||||||
|
apply_auto_tune
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$quick_summary" == true ]]; then
|
||||||
|
show_quick_summary
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create report directory
|
||||||
|
create_report_dir
|
||||||
|
|
||||||
|
# Generate output filename
|
||||||
|
local output_file="$REPORT_DIR/$(generate_filename)"
|
||||||
|
|
||||||
|
# Run analysis
|
||||||
|
if run_analysis "$DURATION" "$output_file"; then
|
||||||
|
echo
|
||||||
|
echo -e "${CYAN}Analysis Summary:${NC}"
|
||||||
|
echo "• Report location: $output_file"
|
||||||
|
echo "• Analysis duration: $DURATION seconds"
|
||||||
|
echo "• Format: $OUTPUT_FORMAT"
|
||||||
|
|
||||||
|
if [[ "$OUTPUT_FORMAT" == "html" ]]; then
|
||||||
|
echo
|
||||||
|
echo "To view the report, run: $0 --show-report"
|
||||||
|
echo "Or open manually: firefox '$output_file'"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo -e "${YELLOW}Tip: Run '$0 --auto-tune' to apply recommended optimizations${NC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run main function if script is executed directly
|
||||||
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||||
|
main "$@"
|
||||||
|
fi
|
||||||
316
scripts/tlp-manager.sh
Executable file
316
scripts/tlp-manager.sh
Executable file
@@ -0,0 +1,316 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# TLP Status and Configuration Tool
|
||||||
|
# Displays TLP status and provides configuration management
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Function to show usage
|
||||||
|
show_usage() {
|
||||||
|
echo "TLP Status and Configuration Tool"
|
||||||
|
echo
|
||||||
|
echo "Usage: $0 [OPTIONS]"
|
||||||
|
echo
|
||||||
|
echo "Options:"
|
||||||
|
echo " -s, --status Show TLP status (default)"
|
||||||
|
echo " -c, --config Show TLP configuration"
|
||||||
|
echo " -r, --recommendations Show optimization recommendations"
|
||||||
|
echo " -t, --toggle-mode Toggle between AC/BAT mode"
|
||||||
|
echo " -b, --battery-info Show detailed battery information"
|
||||||
|
echo " -p, --profile PROFILE Apply power profile (powersave|balanced|performance)"
|
||||||
|
echo " -h, --help Show this help message"
|
||||||
|
echo
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 Show TLP status"
|
||||||
|
echo " $0 -c Show configuration"
|
||||||
|
echo " $0 -p powersave Apply power saving profile"
|
||||||
|
echo " $0 -r Show recommendations"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to check if TLP is installed
|
||||||
|
check_tlp() {
|
||||||
|
if ! command -v tlp &> /dev/null; then
|
||||||
|
echo -e "${RED}Error: TLP is not installed${NC}"
|
||||||
|
echo "Please run the installation script first: ./scripts/install.sh"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show TLP status
|
||||||
|
show_status() {
|
||||||
|
echo -e "${CYAN}TLP Status Information:${NC}"
|
||||||
|
echo "========================================"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Basic TLP status
|
||||||
|
echo -e "${BLUE}System Status:${NC}"
|
||||||
|
tlp-stat -s
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Power source
|
||||||
|
echo -e "${BLUE}Power Source:${NC}"
|
||||||
|
tlp-stat | grep -A 5 "Power source"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# TLP service status
|
||||||
|
echo -e "${BLUE}TLP Service:${NC}"
|
||||||
|
systemctl is-active tlp.service && echo -e "Status: ${GREEN}Active${NC}" || echo -e "Status: ${RED}Inactive${NC}"
|
||||||
|
systemctl is-enabled tlp.service && echo -e "Enabled: ${GREEN}Yes${NC}" || echo -e "Enabled: ${RED}No${NC}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Current power profile
|
||||||
|
echo -e "${BLUE}Current Power Profile:${NC}"
|
||||||
|
tlp-stat | grep -E "Mode|operation mode" | head -3
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show TLP configuration
|
||||||
|
show_config() {
|
||||||
|
echo -e "${CYAN}TLP Configuration:${NC}"
|
||||||
|
echo "========================================"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# CPU settings
|
||||||
|
echo -e "${BLUE}CPU Settings:${NC}"
|
||||||
|
tlp-stat -p
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Disk settings
|
||||||
|
echo -e "${BLUE}Disk Settings:${NC}"
|
||||||
|
tlp-stat -d
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Graphics settings
|
||||||
|
echo -e "${BLUE}Graphics Settings:${NC}"
|
||||||
|
tlp-stat -g
|
||||||
|
echo
|
||||||
|
|
||||||
|
# USB settings
|
||||||
|
echo -e "${BLUE}USB Settings:${NC}"
|
||||||
|
tlp-stat -u
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show battery information
|
||||||
|
show_battery_info() {
|
||||||
|
echo -e "${CYAN}Battery Information:${NC}"
|
||||||
|
echo "========================================"
|
||||||
|
echo
|
||||||
|
|
||||||
|
tlp-stat -b
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Additional battery health info
|
||||||
|
if [[ -d "/sys/class/power_supply/BAT0" ]]; then
|
||||||
|
echo -e "${BLUE}Battery Health Details:${NC}"
|
||||||
|
|
||||||
|
local cycle_count=$(cat /sys/class/power_supply/BAT0/cycle_count 2>/dev/null || echo "N/A")
|
||||||
|
local manufacture_date=$(cat /sys/class/power_supply/BAT0/manufacture_date 2>/dev/null || echo "N/A")
|
||||||
|
local serial=$(cat /sys/class/power_supply/BAT0/serial_number 2>/dev/null || echo "N/A")
|
||||||
|
|
||||||
|
echo "Cycle count: $cycle_count"
|
||||||
|
echo "Manufacture date: $manufacture_date"
|
||||||
|
echo "Serial number: $serial"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show recommendations
|
||||||
|
show_recommendations() {
|
||||||
|
echo -e "${CYAN}Power Optimization Recommendations:${NC}"
|
||||||
|
echo "========================================"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Check current settings and provide recommendations
|
||||||
|
local current_governor=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 2>/dev/null || echo "N/A")
|
||||||
|
local current_brightness=$(cat /sys/class/backlight/*/brightness 2>/dev/null | head -1 || echo "N/A")
|
||||||
|
local max_brightness=$(cat /sys/class/backlight/*/max_brightness 2>/dev/null | head -1 || echo "1")
|
||||||
|
|
||||||
|
echo -e "${BLUE}Current System State:${NC}"
|
||||||
|
echo "CPU Governor: $current_governor"
|
||||||
|
|
||||||
|
if [[ "$current_brightness" != "N/A" && "$max_brightness" != "1" ]]; then
|
||||||
|
local brightness_percent=$(( current_brightness * 100 / max_brightness ))
|
||||||
|
echo "Screen brightness: ${brightness_percent}%"
|
||||||
|
|
||||||
|
if [[ $brightness_percent -gt 70 ]]; then
|
||||||
|
echo -e "${YELLOW}• Consider reducing screen brightness to save power${NC}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo -e "${BLUE}Recommendations:${NC}"
|
||||||
|
|
||||||
|
# Check if on battery
|
||||||
|
local power_source=$(tlp-stat -s | grep "Power source" | awk '{print $3}' || echo "unknown")
|
||||||
|
|
||||||
|
if [[ "$power_source" == "battery" ]]; then
|
||||||
|
echo -e "${GREEN}✓ Running on battery - power saving mode active${NC}"
|
||||||
|
|
||||||
|
# Check governor
|
||||||
|
if [[ "$current_governor" != "powersave" ]]; then
|
||||||
|
echo -e "${YELLOW}• Consider switching to 'powersave' CPU governor${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for running services
|
||||||
|
echo -e "${YELLOW}• Close unnecessary applications${NC}"
|
||||||
|
echo -e "${YELLOW}• Disable unused wireless interfaces${NC}"
|
||||||
|
echo -e "${YELLOW}• Enable laptop mode if available${NC}"
|
||||||
|
|
||||||
|
else
|
||||||
|
echo -e "${BLUE}Running on AC power${NC}"
|
||||||
|
echo -e "• Power saving less critical, but still beneficial"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for power-hungry processes
|
||||||
|
echo
|
||||||
|
echo -e "${BLUE}Power-hungry processes (top CPU users):${NC}"
|
||||||
|
ps aux --sort=-%cpu | head -6 | awk 'NR>1{printf "%-20s %s%%\n", $11, $3}'
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo -e "${BLUE}Quick optimization commands:${NC}"
|
||||||
|
echo "• sudo tlp bat # Force battery mode"
|
||||||
|
echo "• sudo tlp ac # Force AC mode"
|
||||||
|
echo "• sudo powertop --auto-tune # Apply PowerTOP optimizations"
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to toggle power mode
|
||||||
|
toggle_mode() {
|
||||||
|
local current_mode=$(tlp-stat -s | grep "Mode" | awk '{print $2}' | tr -d '[]')
|
||||||
|
|
||||||
|
echo -e "${CYAN}Current mode: $current_mode${NC}"
|
||||||
|
|
||||||
|
if [[ "$current_mode" == "AC" ]]; then
|
||||||
|
echo "Switching to battery mode..."
|
||||||
|
sudo tlp bat
|
||||||
|
echo -e "${GREEN}Switched to battery mode${NC}"
|
||||||
|
else
|
||||||
|
echo "Switching to AC mode..."
|
||||||
|
sudo tlp ac
|
||||||
|
echo -e "${GREEN}Switched to AC mode${NC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to apply power profile
|
||||||
|
apply_profile() {
|
||||||
|
local profile=$1
|
||||||
|
|
||||||
|
case $profile in
|
||||||
|
"powersave")
|
||||||
|
echo -e "${CYAN}Applying power saving profile...${NC}"
|
||||||
|
sudo tlp bat
|
||||||
|
# Additional power saving commands
|
||||||
|
echo 'powersave' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor > /dev/null
|
||||||
|
echo -e "${GREEN}Power saving profile applied${NC}"
|
||||||
|
;;
|
||||||
|
"balanced")
|
||||||
|
echo -e "${CYAN}Applying balanced profile...${NC}"
|
||||||
|
sudo tlp start
|
||||||
|
echo 'ondemand' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor > /dev/null 2>&1 || \
|
||||||
|
echo 'schedutil' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor > /dev/null
|
||||||
|
echo -e "${GREEN}Balanced profile applied${NC}"
|
||||||
|
;;
|
||||||
|
"performance")
|
||||||
|
echo -e "${CYAN}Applying performance profile...${NC}"
|
||||||
|
sudo tlp ac
|
||||||
|
echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor > /dev/null
|
||||||
|
echo -e "${GREEN}Performance profile applied${NC}"
|
||||||
|
echo -e "${YELLOW}Note: This will increase power consumption${NC}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo -e "${RED}Invalid profile: $profile${NC}"
|
||||||
|
echo "Valid profiles: powersave, balanced, performance"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main function
|
||||||
|
main() {
|
||||||
|
local action="status"
|
||||||
|
local profile=""
|
||||||
|
|
||||||
|
# Parse command line arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
-s|--status)
|
||||||
|
action="status"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-c|--config)
|
||||||
|
action="config"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-r|--recommendations)
|
||||||
|
action="recommendations"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-t|--toggle-mode)
|
||||||
|
action="toggle"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-b|--battery-info)
|
||||||
|
action="battery"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-p|--profile)
|
||||||
|
action="profile"
|
||||||
|
profile="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
show_usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option: $1"
|
||||||
|
show_usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check if TLP is installed
|
||||||
|
check_tlp
|
||||||
|
|
||||||
|
# Execute requested action
|
||||||
|
case $action in
|
||||||
|
"status")
|
||||||
|
show_status
|
||||||
|
;;
|
||||||
|
"config")
|
||||||
|
show_config
|
||||||
|
;;
|
||||||
|
"recommendations")
|
||||||
|
show_recommendations
|
||||||
|
;;
|
||||||
|
"toggle")
|
||||||
|
toggle_mode
|
||||||
|
;;
|
||||||
|
"battery")
|
||||||
|
show_battery_info
|
||||||
|
;;
|
||||||
|
"profile")
|
||||||
|
if [[ -z "$profile" ]]; then
|
||||||
|
echo -e "${RED}Error: Profile name required${NC}"
|
||||||
|
show_usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
apply_profile "$profile"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run main function if script is executed directly
|
||||||
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||||
|
main "$@"
|
||||||
|
fi
|
||||||
116
scripts/uninstall.sh
Executable file
116
scripts/uninstall.sh
Executable file
@@ -0,0 +1,116 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Uninstall script for Battery Life Optimizer tools
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
warning() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if running as root
|
||||||
|
check_root() {
|
||||||
|
if [[ $EUID -eq 0 ]]; then
|
||||||
|
error "This script should not be run as root!"
|
||||||
|
error "It will use sudo when necessary."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Restore TLP configuration backup
|
||||||
|
restore_tlp_config() {
|
||||||
|
local backup_pattern="/etc/tlp.conf.backup.*"
|
||||||
|
local latest_backup=$(ls -t $backup_pattern 2>/dev/null | head -n1)
|
||||||
|
|
||||||
|
if [[ -n "$latest_backup" && -f "$latest_backup" ]]; then
|
||||||
|
log "Restoring TLP configuration from backup..."
|
||||||
|
sudo cp "$latest_backup" /etc/tlp.conf
|
||||||
|
success "TLP configuration restored from $latest_backup"
|
||||||
|
else
|
||||||
|
warning "No TLP configuration backup found"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Remove PowerTOP service
|
||||||
|
remove_powertop_service() {
|
||||||
|
log "Removing PowerTOP auto-tune service..."
|
||||||
|
|
||||||
|
if systemctl is-enabled powertop.service &>/dev/null; then
|
||||||
|
sudo systemctl disable powertop.service
|
||||||
|
sudo systemctl stop powertop.service
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -f /etc/systemd/system/powertop.service ]]; then
|
||||||
|
sudo rm /etc/systemd/system/powertop.service
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
fi
|
||||||
|
|
||||||
|
success "PowerTOP service removed"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Uninstall packages
|
||||||
|
uninstall_packages() {
|
||||||
|
log "Removing installed packages..."
|
||||||
|
|
||||||
|
# Ask for confirmation
|
||||||
|
warning "This will remove TLP, PowerTOP, and related packages"
|
||||||
|
read -p "Are you sure? (y/N): " -n 1 -r
|
||||||
|
echo
|
||||||
|
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
sudo apt remove --purge -y \
|
||||||
|
tlp \
|
||||||
|
tlp-rdw \
|
||||||
|
powertop \
|
||||||
|
tp-smapi-dkms \
|
||||||
|
acpi-call-dkms \
|
||||||
|
laptop-mode-tools \
|
||||||
|
thermald \
|
||||||
|
cpufrequtils
|
||||||
|
|
||||||
|
sudo apt autoremove -y
|
||||||
|
success "Packages removed"
|
||||||
|
else
|
||||||
|
warning "Package removal cancelled"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main uninstall function
|
||||||
|
main() {
|
||||||
|
log "Starting Battery Life Optimizer uninstallation..."
|
||||||
|
|
||||||
|
check_root
|
||||||
|
|
||||||
|
remove_powertop_service
|
||||||
|
restore_tlp_config
|
||||||
|
uninstall_packages
|
||||||
|
|
||||||
|
success "Uninstallation completed!"
|
||||||
|
echo
|
||||||
|
log "System restored to previous state"
|
||||||
|
warning "Reboot recommended to ensure all changes take effect"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run main function if script is executed directly
|
||||||
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||||
|
main "$@"
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user