起因
lz晚上闲来无事,便琢磨起如何控制自己的macbook电池充放电。因为lz都是笔记本一直插电使用,所以电池健康度蹭蹭掉,GitHub上有许多控制intel系列MacBook电池电量的软件(大多基于bclm),到了apple自己做的arm芯片后就不好使了
楼主研究了下这个楼的帖子,发现其实smcFanControl的smc二进制文件可以使用,只需要将苹果的SMC key CH0B 设置为 02即可停止充电,设置为00可以继续给电池充电
正文
回到标题,步骤如下
- 下载后编译smc
git clone https://github.com/hholtmann/smcFanControl
cd smcFanControl/smc-command
make
2.将SMC的key CH0B设置为02/00 控制电池充电,需要sudo权限
# Stop charge battery
sudo ./smc -k CH0B -w 02
# Start charge battery
sudo ./smc -k CH0B -w 00
- 为了将来使用方便,可以把smc加入系统path,或加入alias,此处不多做赘述
尾声
- 不要写入奇奇怪怪的smc值,那里不可以
- lz已经在自己的2020 M1 Macbook Air上实验,smc的CH0B可以电池充放电但会不稳定,在一些GitHub的issue中指出CH0C的控制为hard,CH0B控制为Soft,感谢Neon在楼下指出
- 一些软件其实也是使用的这种方法控制电池充/放电(例如AlDente)
- 此命令可以结合其他指令,以简单的脚本控制电池充电到指定电量便停止充电
- 如果遭遇奇奇怪怪的充放电问题,将设置中的电池优化电池充电关闭后再打开,之后重启电脑即可恢复
Update:
下面的脚本可以控制电池保持在60,如需跑在后台用tmux即可
CHARGING=0
smc -k CH0B -w 02
while [ true ];
do
BATT_PERCENT=`pmset -g batt | tail -n1 | awk '{print $3}' | sed s:\%\;::`
echo Battery percent : $BATT_PERCENT
echo Charging status: $CHARGING
if [ $BATT_PERCENT -ge 60 ]; then
if [ "$CHARGING" == "1" ]; then
echo Change to not charging
smc -k CH0B -w 02
CHARGING=0
else
echo Not charging
fi
else
if [ "$CHARGING" == "0" ]; then
echo Change to charging
smc -k CH0B -w 00
CHARGING=1
else
echo Already charging
fi
fi
echo
sleep 60
done