Skip to content

Instantly share code, notes, and snippets.

@artemgordinskiy
Last active December 23, 2023 07:25
Show Gist options
  • Save artemgordinskiy/f4db09d41484387691624ef128fd180b to your computer and use it in GitHub Desktop.
Save artemgordinskiy/f4db09d41484387691624ef128fd180b to your computer and use it in GitHub Desktop.
Forcing the 80% battery limit on ARM macs using fish 🐟

See the instructions on install smc here, then append the snippet below to your ~/.config/fish/config.fish, if you use fish instead of the z shell.

Credit for rewriting to the fish syntax goes to ChatGPT πŸ™ƒ

# Apple Silicon laptops with firmware > 13.0 have a native charge threshold that does not require any userspace daemon.
# This native limit works even when the laptop is sleeping or powered off, making it preferable to the userspace daemon.
# However, it only supports fixed thresholds (80% as upper limit and 70% as lower limit).
# The CHWA key is used to enable/disable the native limit. 01 = 80% limit, 00 = no limit
##
set -g smc_command "/usr/local/bin/smc"
set -g smc_charge_limit_key "CHWA"
set -g smc_charge_limit_status_on "01"
set -g smc_charge_limit_status_off "00"
function battery-charge-limit-enable
if test (uname) = "Darwin"
if not test -e $smc_command
echo 'SMC command not found!'
return 1
end
sudo $smc_command -k $smc_charge_limit_key -w $smc_charge_limit_status_on
else
echo "Not a Darwin system."
end
end
function battery-charge-limit-disable
if test (uname) = "Darwin"
if not test -e $smc_command
echo 'SMC command not found!'
return 1
end
sudo $smc_command -k $smc_charge_limit_key -w $smc_charge_limit_status_off
else
echo "Not a Darwin system."
end
end
function battery-charge-limit-status
if test (uname) = "Darwin"
if not test -e $smc_command
echo 'SMC command not found!'
return 1
end
# Run the smc command and capture its output
set status_raw (sudo $smc_command -k $smc_charge_limit_key -r)
# Extract the status value from the output
if string match -rq 'CHWA\s+\[flag\]\s+\(bytes\s+([0-9a-fA-F]+)\)' -- $status_raw
set -l status_value (string match -r 'CHWA\s+\[flag\]\s+\(bytes\s+([0-9a-fA-F]+)\)' -- $status_raw)
set status_value $status_value[2] # Extract the matched group
switch $status_value
case $smc_charge_limit_status_on
echo "Charge limit is enabled (80%)."
case $smc_charge_limit_status_off
echo "Charge limit is disabled (no limit)."
case '*'
echo "Unknown $smc_charge_limit_key status: $status_value"
end
else
echo "Unable to determine charge limit status."
end
else
echo "Not a Darwin system."
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment