Apple Silicon系列MacBook 命令行控制电池充放电

起因

lz晚上闲来无事,便琢磨起如何控制自己的macbook电池充放电。因为lz都是笔记本一直插电使用,所以电池健康度蹭蹭掉,GitHub上有许多控制intel系列MacBook电池电量的软件(大多基于bclm),到了apple自己做的arm芯片后就不好使了
楼主研究了下这个楼的帖子,发现其实smcFanControl的smc二进制文件可以使用,只需要将苹果的SMC key CH0B 设置为 02即可停止充电,设置为00可以继续给电池充电

正文

回到标题,步骤如下

  1. 下载后编译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
  1. 为了将来使用方便,可以把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

3 个赞

:xieyan:

控制的是CH0B

     /*
     * CH0I/CH0C are "hard" controls that will allow the battery to run down to 0.
     * CH0K/CH0B are "soft" controls that are reset to 0 when SOC drops below 50%;
     * we don't expose these yet.
     */
2 个赞

插电使用为啥会损坏电池?

2 个赞

我也在想这个问题,插电使用不是应该对电池更好吗?

锂电池满电存放是对电池有害的 维持50%是最佳保存状态

苹果之外的大部分笔记本插电使用是没有问题的,但问题是MacBook插电使用会损耗电池
这和苹果的策略有关,即哪怕插电后也会反复充放电池,导致经常可以看到有十几次循环的电池健康度下降百分之十几的情况
只有极其规律的插电使用才能让Mac系统学会不要满电状态充放
因此很多人选择用AIDente,像windows一样定个80%上限

长期不使用一直插着电会损耗电池吗?
还是建议关机不插电?

苹果难道不是默认就只充到 80%?

3 个赞

对呀 我这个电脑一直也是 80%

长期不使用的建议保存方法是不插电,保持电量在50%

这只有在一直插电、或者极其规律使用时才会生效

不插电一个月之后电脑就死机了好像

这可能是电脑自身耗电导致电池用完了
可以考虑关闭一些可能的外部唤醒事件,比如USB外设,网络唤醒(例如睡眠时TCP唤醒:tcpkeepalive)

买一个aidente pro不就完事了

为啥要上pro?regular版本就可以设置limit了?

苹果在保持一段时间80%之后会冲到100%,电池在100%的时候如果电脑发热健康会很快掉,而且巨容易鼓包