语言选择: 简体中文简体中文 line EnglishEnglish

公司动态

如何让macbook只插电使用而不充电电池?

有没有类似的技术方法或者直接有app?要求是做到插电但是不充电 使得电池可以维持在半充满的水平 以延长电池的寿命。

typec充电类型的mac,升级到10.15系统(10.14.6貌似也可以),在设置-》节能-》电池健康-》勾选电池健康管理,系统会每天自动充放电,保持健康。

其实想要保持电池健康,只需要每月多用几次电池就行

如果你的macbook是老款的MagSafe接口,那么恭喜你,你的愿望可以实现:

用一张细纸条或者胶带(更倾向于细纸条,胶带容易留下残胶,比较麻烦,除非用那种低粘度无残留的胶带)遮住充电头的最中央的那个触点(如果纸条比较宽,同时遮住了多个触点,也没有关系,因为充电触点是中心对称的,所以即使遮住了同一边的3个触点也没有问题)。

这样操作后,macbook可以使用充电器供电,但不会对电池充电,充电头指示灯会熄灭(正常情况下充满电池是绿色,充电中是橙色)。

这样的话电池掉电很缓慢,大概几天掉1%。我个人喜欢把电池电量保持在40%~60%之间(这样对电池寿命比较好,可以有效减少充电循环,最重要的是可以避免电池鼓包,我的机器原配的电池由于一直插电使用,循环次数并不是多,但悲剧的是忽然有一天发现本子盖不严实了,机器外壳有点弯曲变形,到店里一问才知道是电池鼓包了,换了新电池后立刻就可以正常合上盖子了,过了一段时间就彻底恢复正常了。电池鼓包应该是长期保持高电量造成的)。当电量低于40%时,就去掉纸条充会儿电,充到60%左右就放回去。如果需要外出长时间使用电池,那就去掉纸条充电到100%,这样也能保证最长使用时间(缺点是需要提前充电,紧急情况下来不及充电的话,只能使用40~60%的电量)。

还记得我 2 年前回答的方法说 M1 不支持吗,之前是因为我自己没有 Apple Silicon 的 MacBook ,一直没办法尝试适配 M1 限制充电的方法,也没空看其他软件的原理。

如今 M1 发布也快 3 年了。时隔三年(有够久的 ) ,我也终于换上 Apple Silicon MacBook 了!可以整点骚活了!

很显然,为了电池寿命,我肯定是要给他限制充电的。问题就在这里,之前回答里限制 BCLM 的方法不好用了。既然这样我肯定要去研究一下 Apple Silicon 上限制充电的方法的,既然都研究了,可能还会自己写一个。

不过呢,在决定要不要自己写之前,为了避免重复造轮子,还是先试用了一下现有的产品,包括闭源付费的和开源的。要是有好用的我就懒得写了x:(提前透露,我最后确实不满意,自己写了 charlie0129/batt

  • 对于某 A 开头的收费软件:你这一开始(我两年前看的)开源吸用户,后面再一看闭源付费了,开源软件哪有你这么搞的?吃相有点难看啊,我忍。怎么 lifetime license 这么贵?还限设备数量,对我这种电脑多的人怎么办?不付钱只有最基础的功能就算了,还睡眠的时候经常失效,那就对了!想解决?乖乖掏钱吧!(这都啥玩意?明明是应该做到一起的功能,非得拆开付费。真以为我不会自己写吗?)。处处都透露着“交钱”两个字,格局小了。而且我就想限制个充电你 bloat 有点多啊?你怎么还要每个月连一下网检查 license 啊?你还是闭源的,我怎么知道你联网发了什么玩意?。。。这软件的态度我属实看不太下去,没有格局,差不多得了,pass
  • 对于某 b 开源软件:开源的,不错,拿来用用。等一下,你就一个菜单栏应用,怎么是用 electron 写的(我的内存、我的硬盘都被你吃完了喵喵喵?)那我就不要 GUI 了,用纯 CLI 吧,不过你这个 cli 错误处理有点不优雅啊?不过无所谓,好用就行。不对,怎么有的时候睡个眠就给我充满了啊(我的 issue:#123)?那你这也不好用啊。不过看在开源的份上,还是值得肯定的,比某 A 好多了
  • ... ...

结论就是,现有产品对于我一个搞开源的人来说,我感觉不太好用。。。

我就只想要一个 简单 的工具,只做一件事(限制充电),并且要把它做好了(比如一睡眠就不小心充满的那种 edge case 都要处理好了),就像 Unix 哲学 那样。

不过好像没东西满足我这个要求,那没办法了,,自己写呗!

前两周花了整整一个周末,了解了一下 M1 上控制充电的原理,用 Golang 和 C 写了个 MVP 。因为 Go 没法直接读写 SMC ,顺便撸了个简单的小轮子,开源了个 Go 读写 SMC (控制 MacBook 硬件)的库 charlie0129/gosmc 。

最终 batt 开源了。可以控制你的 Apple Silicon MacBook 的充电,而且重启、睡眠不影响,目前主要面向 power user 和开发者。当然,后续也在维护,毕竟我自己也在用。用了几周感觉大差不差了也就更新了知乎这篇回答。

(欢迎给 GitHub 仓库点点 star 小星星!)

charlie0129/batt

GitHub - charlie0129/batt: Control and limit battery charging on Apple Silicon MacBooks.

由于知乎回答修改麻烦,所以建议直接去 GitHub 看捏!GitHub 仓库那边的 README 更详细,也会跟随版本及时更新。不过 GitHub 那边的原文是英文的,知乎这里其实相于我又人工把一部分翻译成中文了
  • 开源且免费:甚至有其他某些工具付费的功能(例如充电时阻止 idle sleep ,睡眠前暂停充电等,对这两个功能 GitHub 仓库那边 ##Advanced 章节有详细介绍)。没有 ad, tracking, telemetry, analytics 和其他 bullshit 。因为开源,所以你可以直接阅读源代码,确保它不会做奇怪的事情。
  • 简单:它只做充电限制,并且把它做好了。例如你可能在使用其他开源/非付费软件时限制充电发现过,如果你的 mac 在一个充电 session 中睡着了,那有可能电池会直接充满。batt 就考虑到了这些 edge case ,并且会按照你所期望的方式工作。虽然为了保持 batt 简单,其他功能刻意没加,不过如果你想要其他功能,可以在 GitHub 上面开 issue 讨论。
  • 轻量:由于(目前)是纯 CLI 工具,这本来就是非常轻量的,跑不跑根本没感觉。不像 electron GUI 会把本来就少的内存都给吃完了。

确实,macOS 有优化电池充电功能(具体介绍可以看看 GitHub 仓库的 readme ),不过他是根据你以往习惯来决定的,一旦你的作息不规律,那他就没用了。并且,让 macOS 替你决定就失去了 predictability (我很看重),你不能决定什么时候充电什么时候不充电了。所以,建议在使用 batt 之前关闭 macOS 的优化电池充电。

而使用 batt 就能够让你完全掌控充电。

然后目前是纯命令行的方式,所以可能需要你对命令行有点了解。加一个 macOS 原生 GUI 也挺好的,不过目前我确实没精力开发(绝对不是懒x)。如果你开发出来了 GUI ,可以来发发 PR 或者让我在这里附一个链接到你的仓库。

有的没的也说了,接下来开始安装:

自动安装:

  1. 自动安装稳定版,终端运行:
bash <(curl -fsSL https://github.com/charlie0129/batt/raw/master/hack/install.sh)

(注意,你的网络需要能访问 GitHub ,不然会卡住不动。如果你有代理,你可以先设置代理 export https_proxy=http://你的代理地址 再运行上面的命令)如果后续有新版本,你也可以用这个命令直接升级到下一个稳定版。

2. 现在就帮你完成了手动安装一节的前 4 步了,接下来跳到手动安装一节的第 5 步继续即可。

手动安装:

  1. Releases · charlie0129/batt 获取编译好的二进制(稳定版)。下载完后解压,你会获得一个 batt 二进制文件。如果你需要开发版(最新的功能和bug修复,比如新版本有控制 MagSafe LED 的功能),你可以从 GitHub Action 下载自动构建的版本 GitHub Actions: build-test-binary (3 个月有效期,下载后 chmod +x )
  2. 把这个二进制文件放到 $PATH 里面,并且最好之后就别动了。比如可以放在 /usr/bin/local 里。(虽然你不放在 $PATH 里也没问题,不过之后使用不太方便)
  3. 在终端运行 batt 看看效果,如果你看到了帮助信息,那说明好了。
  4. 安装 daemon ,daemon 是真正控制充电的组件。运行 sudo batt install --allow-non-root-access 来安装。后面的 flag 是让你之后运行 batt 可以不加 sudo 的,如果你想要牺牲易用性换安全性,那可以把这个 flag 去掉。
  5. 如果你什么都没看见那最好,不过如果你的电脑上开了 GateKeeper ,你会看到类似“无法打开batt”或者是”batt已损坏“之类的 alert 。这时有两种办法 (建议)1. 打开系统偏好设置 -> 安全性与隐私 -> 通用 -> 仍要打开; 或者 2. 运行 sudo spctl --master-disable来直接禁用 GateKeeper 。
  6. 运行 batt status 看看有没有安装好了,如果你看到一些状态信息,那说明成功了。
  7. 默认 batt 会设定 60% 的充电限制,运行 batt limit xx 来自定义 xx% 的充电限制。
  8. 关闭 macOS 的“优化电池充电”。在系统设置->电池->取消勾选“优化电池充电”。
  9. 接下来就结束了, batt 会在后台自动运行。

如果你当前电量大于你设置的充电限制,那只会暂停充电,并不会直接耗电到你设置的 level 。你可能需要用电池到你设置的充电限制以下才能看到效果(如果你不想拔电,你可以强制使用电池来放电,batt 有这个功能 batt adapter disable

如果要关闭充电限制,运行 batt limit 100 设置为 100% 即可。

  • 运行 batt help 看看有哪些额外的命令,比如有禁止充电器的功能(用于在插电的时候强制用电池) 、防止 idle sleep 、睡眠前暂停充电等
  • 可以继续访问 GitHub 仓库里的 README 看看有哪些高级用法,新功能,比如还没进入稳定版的 MagSafe LED 控制功能(剩下的东西有点多,不想翻译了ww),还有编译方法、项目结构、FAQ 等。
  • 更进一步可以去翻翻代码,了解原理,你也可以写自己的充电限制软件!

为了方便同步,在 GitHub 有常见问题的说明: github.com/charlie0129/

可以在 GitHub 提提 issue


发现github上有开发者把以下的操作编写了一个带图形界面的app了,实现的功能是一样的,懒得折腾命令行的可以去看看:github.com/davidwernhar

M1 MacBook 的用户建议不要抱太大希望(,我这个操作所有测试都是在 Intel 处理器的 Mac 上进行的,没有在 M1 上面做任何测试。我短期内也没有要买 M1 的打算,所以应该不会更新适用于 Apple Silicon 的方法抱歉,M1的操作方法就留给大家探索了,研究出来了欢迎私信。

在macOS 10.15.5及以上系统中有电池健康功能,系统觉得你不要充电时会停下来,但是你无法手动控制充电限制为多少。

如果你想更加自由地控制你的电池能冲到多少,可以参照以下我的方法(受限于手头设备,目前在15寸2017和2018 MBP, macOS 10.14, 10.15, 11.0测试过,其他相近机型和系统大概率能用,请自行测试)。

以下内容稍微有点硬核(其实难度不大,步骤说的比较详细,按着步骤走一般不会出问题),了解CLI基础操作的话更好。目前我这个操作方法网上几乎找不到类似的教程,但是实测有效。

MacBook系列是通过SMC (System Mangement Controller) 管理部分硬件的,包括电池。

我发现在SMC中有一个键为"BCLM" (没有官方文档,猜测为Battery Charge Limit)的缩写,默认值为0x64,即10进制的100,很可能代表充电限制为100%,实测后发现确实。

这就好办了,将你需要的电量限制强制写入这个键值即可,你的MacBook在达到这个电量限制的时候就会停止充电而只使用电源适配器。

好在开源的 smcFanControl 提供了一个 SMC 工具,以下是操作步骤:(确保你安装了Xcode或者 Xcode commandline tools 两者之一,以正常编译C代码。两个都没有安装的话只要安装后者就行了

打开“终端”(你可以在“程序坞->其他”里找到它),依次输入每条命令并回车执行:

  1. git clone https://github.com/hholtmann/smcFanControl.git

2. cd smcFanControl/smc-command

3. make

4. sudo https://www.zhihu.com/question/smc -k BCLM -w <你需要的充电限制的16进制值> (不包括尖括号)

这条命令执行的时候会提示你输入密码,输入你的开机密码再回车即可(输入密码的时候光标是不会动的,其实已经输进去了)。

(比如 sudo https://www.zhihu.com/question/smc -k BCLM -w 32,这设置了充电限制为50%,若你当前电量超过了50%就会停止充电,若低于50%就会充电至50%)


至此所有的设置操作已经结束了。以后你想重新设置只要重新打开终端执行第2和第4条命令就行了。

比如你设置了50%,而你当前的电量大于50%,那么你的电量只会保持当前电量不变。要看到效果的话只要把电用到50%以下再充电即可。

比如你设置了充电限制为60%,你实际会看到的是冲到了62%才停止充电。这是正常现象,macOS显示的电量会比实际的多一些(跟iPhone的电量显示一个道理)。

建议设置的充电限制在32~64(16进制)之间(即50%~100%)。

如果设置成功,接通电源时,在停止充电的后菜单栏电池的菜单中会显示“电池不在充电”和“电源:电源适配器”(不清楚中文系统中确切的翻译是什么,大概翻译了一下233),而不是“电池已充满”。

菜单栏电池图标


这个设置是一直有效的,重启之后不用重新设置。当然,如果你的Mac死机了,升级系统了或者你强制重启了它,SMC中的某些键会恢复默认值,它就恢复默认的100%充电限制了。

如果因为上述原因你发现你的充电限制没了,或者你想重新设置,打开终端执行一遍上面的第2条和第4条命令即可(不用全部重来)。

要手动恢复默认设置的话:sudo https://www.zhihu.com/question/smc -k BCLM -w 64 即可,表示设置为100%充电限制。

你也可以检查一下你有没有设置成功:https://www.zhihu.com/question/smc -k BCLM -r,这会返回当前BCLM中的值,查看终端返回的值是不是你设置的值。

如果觉得终端设置麻烦,我给出几个自动化操作的方案,都是以上面的命令行操作为基础的(要更复杂一些,以后有空再补充):

1. 把以上操作保存为一个脚本,直接打开运行设置。

2. 利用Apple Script直接保存为一个带图形界面的app,直接运行来设置。

3. 使用hammerspoon,在系统的菜单栏里面加一个图标,加几个设置电量的按钮。这也是我自己的做法。

最简单的方法,也是最不实用的方法,合盖外接显示器充电

对于 Intel 芯片的 Mac,你可以在保持网络连接没有任何阻碍的情况下,打开终端(Terminal),依次输入以下指令(确保每一项指令都执行成功以后再执行下一条):

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew tap zackelia/formulae
brew install bclm
sudo bclm write 68

这里的“68”代表我打算让电池电量达到 70%(硬件实际为 68%,系统界面显示会比实际多 2%)就停止充电,你可以根据自己的偏好更改数字,建议在40到80之间。

所有指令执行完毕以后,你的电脑已经可以按照你的设置限制充电了,但是为了防止系统升级或宕机后参数被意外重置,你可以输入

sudo bclm persist

来保证你的设置在任何状态下都生效。

对于 Apple 芯片的 Mac,这个数字仅支持 80 和 100 两个值,并且 macOS 版本要高于 13.0。

详情见项目介绍页:

github.com/zackelia/bcl


你也可以选择图形界面的 Charge Limiter,安装后仅输入数字即可实现相同功能,原理相同。

github.com/godly-devoti


另外还有 AlDente,可以实现更复杂的功能,但是睡眠状态下所有设置可能不起作用。而且此应用在电池电量达到限制比例时,电源插头指示灯会一直显示为在充电状态(橙色),看着可能会比较膈应。好处是可以实时看到电池和外接电源的使用分配情况,还可以设置自放电到一定比例再开始充电(比如限制70%停止充电,可以设置电池自消耗到60%才开始充电,而不是始终保持电量在70%)。不过这些高级功能仅属于付费用户,免费版仅能实现限制充电比例这一项功能。

平台注册入口