如何计算我的 Mac 笔记本电脑在给定时间段内消耗了多少电能(以瓦特小时为单位)?

如何计算我的 Mac 笔记本电脑在给定时间段内消耗了多少电能(以瓦特小时为单位)?

我正在尝试编写一些软件,让我能够计算我的 Macbook M1 Air 笔记本电脑在一段时间内消耗了多少电量。我打算编写脚本,并定期(也许一天一次?)将这些数字发送到一个中心位置,这样我就可以跟踪设备的总能耗。

我有一个物理能量监测插头,但不幸的是,它没有 API,而且因为我经常四处走动,所以当我插入笔记本电脑时,我没有办法总是使用它,因此我想看看是否有办法仅使用软件来获取类似的信息。

我做了一些研究,看起来 Mac 的活动监视器通过“能量分数”指标在每个应用程序上跟踪这一点,但我似乎无法从中推断出任何瓦时使用量。

有什么方法可以让我获取这些信息吗?

答案1

经过几个小时的修补、研究等,我想我偶然发现了使用ioregApple 开发工具附带的 CLI 实用程序来实现此目的的最佳方法。

在注册表中,Apple 存储了大量的硬件数据,包括有关电池使用情况的信息(这样您就可以了解笔记本电脑的电池总容量,以及经历了多少个完整的充电周期),但它还包括有关电源适配器插入墙上插座时的信息,这才是有趣的地方。

就我而言,我实际上并不关心笔记本电脑的电池使用了多少,因为我的最终目标是弄清楚笔记本电脑在给定的时间段内消耗了多少能量,而最好的方法就是实际测量从墙上适配器吸收了多少能量——这样,每当笔记本电脑主动插入电源时,我都会将这个能量消耗记录在某处,最终可以将其加起来以获得随时间推移的准确表示。

事实证明,这些数据可通过注册表项ioreg下的实用程序获得AppleSmartBattery -> BatteryData -> AdapterPower。您可以使用以下命令获取从墙上适配器拉出的确切瓦数:

ioreg -rw0 -c AppleSmartBattery | grep BatteryData | grep -o '"AdapterPower"=[0-9]*' | cut -c 16- | xargs -I %  lldb --batch -o "    print/f %" | grep -o '$0 = [0-9.]*' | cut -c 6-

此命令将查询数据,将其转换为适当的格式(IEEE754 浮点数),然后将其输出到控制台。最后,您将获得以下值之一:

0

如果您没有插入墙上适配器,则意味着您没有从适配器中获取任何瓦特。或者...像这样的浮点数:

31.8184719

这是从墙上吸取的瓦数。

附言我使用了一个硬件能量监控插头来确认硬件监控器和实用程序报告的笔记本电脑所消耗的瓦数是否相同,ioreg如上所述 - 它们几乎相同,因此我高度相信这种方法是准确的。

下一个难题是将瓦特数转换为瓦时测量值,即一小时内消耗的瓦特数。

我在这里做了一些额外的测试,我了解到ioreg输出信息大约每 30 秒左右更改一次,因为它返回的值看起来被缓存了。

为了计算瓦时数,我最终做了以下事情:

  1. 每 60 秒将消耗的瓦数存储在日志文件中一次(通过简单的 cron 脚本)
  2. 将每个瓦特测量值除以 60(因为我们每分钟采样一次)
  3. 将所有这些测量值相加(60 次测量值 = 1 小时)以尽可能接近实时地计算出正在使用的总瓦时数。

我最终创建了一个小型 GitHub 仓库如果您想查看的话,其中包含脚本和 crontab 文件。

这种方法的问题

上述方法存在一些问题,我不知道如何解决,但考虑到这是一个软件解决方案,我认为它尽可能好。

  1. 如果笔记本电脑插入墙上充电器但笔记本电脑处于关闭状态(或者软件没有运行,例如笔记本电脑处于睡眠状态),那么显然不会记录任何能源使用详细信息。
  2. 您需要运行一个单独的程序来解析一段时间内的电能日志,并进行汇总,以便得出笔记本电脑在给定时间段内使用的总瓦时数。这不是什么大问题,但值得考虑。

相关内容