summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkj_sh604 <43.splash@gmail.com>2026-02-19 22:35:53 -0500
committerkj_sh604 <43.splash@gmail.com>2026-02-19 22:35:53 -0500
commitb8fd9cd0dc73f28c3b4f7e0faf6c5568550e404d (patch)
treeb87afe72f0b53c09360ea0a3c8f3af58f70229da
parent2ebb015051b4f4edfa3a91924b2a6a259c88b532 (diff)
feat: new thinkpad battery script
-rwxr-xr-x.local/bin/bat-thresh-toggle103
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