- 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
316 lines
9.5 KiB
Bash
Executable File
316 lines
9.5 KiB
Bash
Executable File
#!/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 |