diff options
| author | kj_sh604 <43.splash@gmail.com> | 2026-02-19 22:35:53 -0500 |
|---|---|---|
| committer | kj_sh604 <43.splash@gmail.com> | 2026-02-19 22:35:53 -0500 |
| commit | b8fd9cd0dc73f28c3b4f7e0faf6c5568550e404d (patch) | |
| tree | b87afe72f0b53c09360ea0a3c8f3af58f70229da | |
| parent | 2ebb015051b4f4edfa3a91924b2a6a259c88b532 (diff) | |
feat: new thinkpad battery script
| -rwxr-xr-x | .local/bin/bat-thresh-toggle | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/.local/bin/bat-thresh-toggle b/.local/bin/bat-thresh-toggle new file mode 100755 index 0000000..2819132 --- /dev/null +++ b/.local/bin/bat-thresh-toggle @@ -0,0 +1,103 @@ +#!/bin/sh + +THRESH_START_PATH="/sys/class/power_supply/BAT0/charge_control_start_threshold" +THRESH_STOP_PATH="/sys/class/power_supply/BAT0/charge_control_end_threshold" +TLP_DROP_IN="/etc/tlp.d/05-bat-thresh.conf" + +TRAVEL_START=85 +TRAVEL_STOP=99 +DOCKED_START=75 +DOCKED_STOP=89 +DEFAULT_START=96 +DEFAULT_STOP=100 + +usage() { + cat <<EOF +usage: $(basename "$0") [OPTION] + +toggles BAT0 charge thresholds between travel and docked modes, +writing a persistent TLP drop-in to ${TLP_DROP_IN}. + +options: + (none) toggle between travel (${TRAVEL_START}/${TRAVEL_STOP}%) and docked (${DOCKED_START}/${DOCKED_STOP}%) + --system-default restore TLP built-in defaults (${DEFAULT_START}/${DEFAULT_STOP}%) and remove drop-in + -h, --help show this help message and exit + +modes: + travel START_CHARGE_THRESH_BAT0=${TRAVEL_START} STOP_CHARGE_THRESH_BAT0=${TRAVEL_STOP} + docked START_CHARGE_THRESH_BAT0=${DOCKED_START} STOP_CHARGE_THRESH_BAT0=${DOCKED_STOP} + system-default START_CHARGE_THRESH_BAT0=${DEFAULT_START} STOP_CHARGE_THRESH_BAT0=${DEFAULT_STOP} + +EOF +} + +case "${1}" in + -h|--help) usage; exit 0 ;; +esac + +# gotta be root to write to sysfs +if [ "$(id -u)" -ne 0 ]; then + usage + sleep 1 + echo "error: script must be run as root."; echo "" + exit 1 +fi + +# make sure the sysfs nodes are actually there +[ -f "$THRESH_START_PATH" ] || { echo "error: $THRESH_START_PATH not found — is thinkpad_acpi loaded?"; exit 1; } +[ -f "$THRESH_STOP_PATH" ] || { echo "error: $THRESH_STOP_PATH not found — is thinkpad_acpi loaded?"; exit 1; } + +# --system-default: remove drop-in and restore TLP built-in defaults (96/100) +if [ "${1}" = "--system-default" ]; then + printf "%s" "$DEFAULT_STOP" > "$THRESH_STOP_PATH" || { echo "error: failed to write stop threshold."; exit 1; } + printf "%s" "$DEFAULT_START" > "$THRESH_START_PATH" || { echo "error: failed to write start threshold."; exit 1; } + echo "restored system defaults — start: ${DEFAULT_START}% stop: ${DEFAULT_STOP}%" + if [ -f "$TLP_DROP_IN" ]; then + rm "$TLP_DROP_IN" \ + && echo "${TLP_DROP_IN} removed — TLP will use its built-in defaults after reboot." \ + || echo "error: failed to remove ${TLP_DROP_IN}." + else + echo "note: ${TLP_DROP_IN} was not present — nothing to remove." + fi + exit 0 +fi + +current_stop=$(cat "$THRESH_STOP_PATH") + +# determine which mode to switch INTO based on the current stop threshold +case "$current_stop" in + "$TRAVEL_STOP") + target_mode="docked" + new_start="$DOCKED_START" + new_stop="$DOCKED_STOP" + ;; + *) + target_mode="travel" + new_start="$TRAVEL_START" + new_stop="$TRAVEL_STOP" + ;; +esac + +# the kernel enforces start < stop at all times, so write order matters +case "$target_mode" in + travel) + printf "%s" "$new_stop" > "$THRESH_STOP_PATH" || { echo "error: failed to write stop threshold."; exit 1; } + printf "%s" "$new_start" > "$THRESH_START_PATH" || { echo "error: failed to write start threshold."; exit 1; } + ;; + docked) + printf "%s" "$new_start" > "$THRESH_START_PATH" || { echo "error: failed to write start threshold."; exit 1; } + printf "%s" "$new_stop" > "$THRESH_STOP_PATH" || { echo "error: failed to write stop threshold."; exit 1; } + ;; +esac + +echo "switched to $target_mode mode — start: ${new_start}% stop: ${new_stop}%" + +# write a dedicated drop-in so thresholds survive a reboot; no sed fragility +if [ -d "/etc/tlp.d" ]; then + printf '# managed by bat-thresh-toggle — do not edit by hand\nSTART_CHARGE_THRESH_BAT0=%s\nSTOP_CHARGE_THRESH_BAT0=%s\n' \ + "$new_start" "$new_stop" > "$TLP_DROP_IN" \ + && echo "${TLP_DROP_IN} written" \ + || echo "error: failed to write ${TLP_DROP_IN}." +else + echo "note: /etc/tlp.d not found - sysfs write is not persistent across reboots." +fi
\ No newline at end of file |
