From 971f40f0ca2dad2ab79aeb5ddf1beb818bb68bed Mon Sep 17 00:00:00 2001 From: PurpleWazard <155469001+PurpleWazard@users.noreply.github.com> Date: Mon, 11 Mar 2024 01:09:26 -0500 Subject: [PATCH] Add conservation mode to lenovo laptops (#652) * adding support for lenovo ideapad_laptop devices * testing lenovo_laptop * renamed functions * fix code bugs * updated readme with lenovo laptop conservation mode. --- README.md | 5 + auto_cpufreq/battery_scripts/battery.py | 73 +++++--------- auto_cpufreq/battery_scripts/ideapad.py | 39 -------- auto_cpufreq/battery_scripts/ideapad_acpi.py | 59 +++++++++++ .../battery_scripts/ideapad_laptop.py | 99 +++++++++++++++++++ auto_cpufreq/battery_scripts/thinkpad.py | 40 ++++++-- 6 files changed, 218 insertions(+), 97 deletions(-) delete mode 100644 auto_cpufreq/battery_scripts/ideapad.py create mode 100644 auto_cpufreq/battery_scripts/ideapad_acpi.py create mode 100644 auto_cpufreq/battery_scripts/ideapad_laptop.py diff --git a/README.md b/README.md index 8b6839c..5d690c1 100644 --- a/README.md +++ b/README.md @@ -501,6 +501,11 @@ start_threshold = 20 stop_threshold = 80 ``` +### Lenovo_laptop conservation mode + +this works only with `lenovo_laptop` kernel module compatable laptops. + +add `ideapad_laptop_conservation_mode = true` to your `auto-cpufreq.conf` file ## Troubleshooting diff --git a/auto_cpufreq/battery_scripts/battery.py b/auto_cpufreq/battery_scripts/battery.py index 0cc6fe5..7ebb9d0 100644 --- a/auto_cpufreq/battery_scripts/battery.py +++ b/auto_cpufreq/battery_scripts/battery.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 import subprocess -from auto_cpufreq.core import get_config, root_check -from auto_cpufreq.battery_scripts.thinkpad import * -from auto_cpufreq.battery_scripts.ideapad import * +from auto_cpufreq.battery_scripts.thinkpad import thinkpad_setup, thinkpad_print_thresholds +from auto_cpufreq.battery_scripts.ideapad_acpi import ideapad_acpi_setup, ideapad_acpi_print_thresholds +from auto_cpufreq.battery_scripts.ideapad_laptop import ideapad_laptop_setup, ideapad_laptop_print_thresholds def lsmod(module): @@ -15,55 +15,32 @@ def lsmod(module): return False -def battery_start_threshold(): - conf = get_config() - if conf.has_option("battery", "start_threshold"): - start_threshold = conf["battery"]["start_threshold"] - return int(start_threshold) - else: - return 0 - - -def battery_stop_threshold(): - conf = get_config() - if conf.has_option("battery", "stop_threshold"): - stop_threshold = conf["battery"]["stop_threshold"] - return int(stop_threshold) - else: - return 100 - - def battery_setup(): - root_check() - conf = get_config() - if conf.has_option("battery", "enable_thresholds"): - if conf["battery"]["enable_thresholds"] == "true": - if lsmod("thinkpad_acpi"): - thinkpad_setup(battery_start_threshold(), - battery_stop_threshold()) - elif lsmod("ideapad_acpi"): - ideapad_setup(battery_start_threshold(), - battery_stop_threshold()) - else: - pass - else: - pass + + if lsmod("thinkpad_acpi"): + thinkpad_setup() + + elif lsmod("ideapad_acpi"): + ideapad_acpi_setup() + + elif lsmod("ideapad_laptop"): + ideapad_laptop_setup() + else: - pass + return def battery_get_thresholds(): - conf = get_config() - if conf.has_option("battery", "enable_thresholds"): - if conf["battery"]["enable_thresholds"] == "true": - print("-" * 30) - if lsmod("thinkpad_acpi"): - thinkpad_print_thresholds() - elif lsmod("ideapad_acpi"): - ideapad_print_thresholds() - else: - pass - else: - return + if lsmod("thinkpad_acpi"): + thinkpad_print_thresholds() + + elif lsmod("ideapad_acpi"): + ideapad_acpi_print_thresholds() + + elif lsmod("ideapad_laptop"): + ideapad_laptop_print_thresholds() + else: return + + diff --git a/auto_cpufreq/battery_scripts/ideapad.py b/auto_cpufreq/battery_scripts/ideapad.py deleted file mode 100644 index b19ed87..0000000 --- a/auto_cpufreq/battery_scripts/ideapad.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python3 -import os -import subprocess -from auto_cpufreq.core import root_check - - -def set_battery(value, mode, bat): - file_path = f'/sys/class/power_supply/BAT{bat}/charge_{mode}_threshold' - try: - subprocess.check_output(f"echo {value} | tee /sys/class/power_supply/BAT{bat}/charge_{mode}_threshold", shell=True, text=True) - except Exception as e: - print(f"Error writing to {file_path}: {e}") - - -def ideapad_setup(start_threshold, stop_threshold): - root_check() - battery_count = len([name for name in os.listdir("/sys/class/power_supply/") if name.startswith('BAT')]) - for bat in range(battery_count): - set_battery(start_threshold, "start", bat) - set_battery(stop_threshold, "stop", bat) - - -def ideapad_print_thresholds(): - root_check() - battery_count = len([name for name in os.listdir( - "/sys/class/power_supply/") if name.startswith('BAT')]) - print(f"number of batteries = {battery_count}") - for b in range(battery_count): - try: - with open(f'/sys/class/power_supply/BAT{b}/charge_start_threshold', 'r') as f: - print(f'battery{b} start threshold is set to {f.read()}') - f.close() - - with open(f'/sys/class/power_supply/BAT{b}/charge_stop_threshold', 'r') as f: - print(f'battery{b} stop threshold is set to {f.read()}') - f.close() - - except Exception as e: - print(f"Error reading battery thresholds: {e}") diff --git a/auto_cpufreq/battery_scripts/ideapad_acpi.py b/auto_cpufreq/battery_scripts/ideapad_acpi.py new file mode 100644 index 0000000..ca5f928 --- /dev/null +++ b/auto_cpufreq/battery_scripts/ideapad_acpi.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +import os +import subprocess +from auto_cpufreq.core import get_config + + +def set_battery(value, mode, bat): + try: + subprocess.check_output( + f"echo {value} | tee /sys/class/power_supply/BAT{bat}/charge_{mode}_threshold", shell=True, text=True) + except Exception as e: + print(f"Error writing to file_path: {e}") + + +def get_threshold_value(mode): + + config = get_config() + if config.has_option("battery", f"{mode}_threshold"): + return config["battery"][f"{mode}_threshold"] + else: + if mode == "start": + + return 0 + else: + return 100 + + +def ideapad_acpi_setup(): + config = get_config() + + if not config.has_option("battery", "enable_thresholds"): + return + if not config["battery"]["enable_thresholds"] == "true": + return + + battery_count = len([name for name in os.listdir( + "/sys/class/power_supply/") if name.startswith('BAT')]) + + for bat in range(battery_count): + set_battery(get_threshold_value("start"), "start", bat) + set_battery(get_threshold_value("stop"), "stop", bat) + + +def ideapad_acpi_print_thresholds(): + battery_count = len([name for name in os.listdir( + "/sys/class/power_supply/") if name.startswith('BAT')]) + print(f"number of batteries = {battery_count}") + for b in range(battery_count): + try: + with open(f'/sys/class/power_supply/BAT{b}/charge_start_threshold', 'r') as f: + print(f'battery{b} start threshold is set to {f.read()}') + f.close() + + with open(f'/sys/class/power_supply/BAT{b}/charge_stop_threshold', 'r') as f: + print(f'battery{b} stop threshold is set to {f.read()}') + f.close() + + except Exception as e: + print(f"Error reading battery thresholds: {e}") diff --git a/auto_cpufreq/battery_scripts/ideapad_laptop.py b/auto_cpufreq/battery_scripts/ideapad_laptop.py new file mode 100644 index 0000000..f424a83 --- /dev/null +++ b/auto_cpufreq/battery_scripts/ideapad_laptop.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +import os +import subprocess +from auto_cpufreq.core import get_config + + +def set_battery(value, mode, bat): + try: + subprocess.check_output( + f"echo {value} | tee /sys/class/power_supply/BAT{bat}/charge_{mode}_threshold", shell=True, text=True) + except Exception as e: + print(f"Error writing to file_path: {e}") + + +def get_threshold_value(mode): + + config = get_config() + if config.has_option("battery", f"{mode}_threshold"): + return config["battery"][f"{mode}_threshold"] + else: + if mode == "start": + return 0 + else: + return 100 + + +def conservation_mode(value): + try: + subprocess.check_output( + f"echo {value} | tee /sys/bus/platform/drivers/ideapad_acpi/VPC2004:00/conservation_mode", shell=True, text=True) + print(f"conservation_mode is {value}") + return + except: + print("unable to set conservation mode") + return + + +def check_conservation_mode(): + try: + value = subprocess.check_output( + "cat /sys/bus/platform/drivers/ideapad_acpi/VPC2004:00/conservation_mode", shell=True, text=True) + if value == "1": + return True + elif value == "0": + return False + else: + print("could not get value from conservation mode") + return None + except: + print("could not get the value from conservation mode") + return False + + +def ideapad_laptop_setup(): + config = get_config() + + if not config.has_option("battery", "enable_thresholds"): + return + if not config["battery"]["enable_thresholds"] == "true": + return + + battery_count = len([name for name in os.listdir( + "/sys/class/power_supply/") if name.startswith('BAT')]) + + if config.has_option("battery", "ideapad_laptop_conservation_mode"): + if config["battery"]["ideapad_laptop_conservation_mode"] == "true": + conservation_mode(1) + return + if config["battery"]["ideapad_laptop_conservation_mode"] == "false": + conservation_mode(0) + + if check_conservation_mode() is False: + for bat in range(battery_count): + set_battery(get_threshold_value("start"), "start", bat) + set_battery(get_threshold_value("stop"), "stop", bat) + else: + print("conservation mode is enabled unable to set thresholds") + + +def ideapad_laptop_print_thresholds(): + if check_conservation_mode() is True: + print("conservation mode is on") + return + + battery_count = len([name for name in os.listdir( + "/sys/class/power_supply/") if name.startswith('BAT')]) + print(f"number of batteries = {battery_count}") + for b in range(battery_count): + try: + with open(f'/sys/class/power_supply/BAT{b}/charge_start_threshold', 'r') as f: + print(f'battery{b} start threshold is set to {f.read()}') + f.close() + + with open(f'/sys/class/power_supply/BAT{b}/charge_stop_threshold', 'r') as f: + print(f'battery{b} stop threshold is set to {f.read()}') + f.close() + + except Exception as e: + print(f"Error reading battery thresholds: {e}") diff --git a/auto_cpufreq/battery_scripts/thinkpad.py b/auto_cpufreq/battery_scripts/thinkpad.py index be1c8b4..214ed40 100644 --- a/auto_cpufreq/battery_scripts/thinkpad.py +++ b/auto_cpufreq/battery_scripts/thinkpad.py @@ -1,27 +1,47 @@ #!/usr/bin/env python3 import os import subprocess -from auto_cpufreq.core import root_check +from auto_cpufreq.core import get_config def set_battery(value, mode, bat): - file_path = f'/sys/class/power_supply/BAT{bat}/charge_{mode}_threshold' try: - subprocess.check_output(f"echo {value} | tee /sys/class/power_supply/BAT{bat}/charge_{mode}_threshold", shell=True, text=True) + subprocess.check_output( + f"echo {value} | tee /sys/class/power_supply/BAT{bat}/charge_{mode}_threshold", shell=True, text=True) except Exception as e: - print(f"Error writing to {file_path}: {e}") + print(f"Error writing to file_path: {e}") -def thinkpad_setup(start_threshold, stop_threshold): - root_check() - battery_count = len([name for name in os.listdir("/sys/class/power_supply/") if name.startswith('BAT')]) +def get_threshold_value(mode): + + config = get_config() + if config.has_option("battery", f"{mode}_threshold"): + return config["battery"][f"{mode}_threshold"] + else: + if mode == "start": + + return 0 + else: + return 100 + + +def thinkpad_setup(): + config = get_config() + + if not config.has_option("battery", "enable_thresholds"): + return + if not config["battery"]["enable_thresholds"] == "true": + return + + battery_count = len([name for name in os.listdir( + "/sys/class/power_supply/") if name.startswith('BAT')]) + for bat in range(battery_count): - set_battery(start_threshold, "start", bat) - set_battery(stop_threshold, "stop", bat) + set_battery(get_threshold_value("start"), "start", bat) + set_battery(get_threshold_value("stop"), "stop", bat) def thinkpad_print_thresholds(): - root_check() battery_count = len([name for name in os.listdir( "/sys/class/power_supply/") if name.startswith('BAT')]) print(f"number of batteries = {battery_count}")