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

rde*_*ges 1 macos

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

我有一个物理能源监控插头,但不幸的是,它没有 API,而且因为我经常走动,所以当我插入笔记本电脑时,没有一种简单的方法可以始终使用它,因此为什么我想看看是否有一种方法可以单独使用软件来获取类似的信息。

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

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

rde*_*ges 6

经过几个小时的修补、研究等之后,我想我已经偶然发现了使用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-
Run Code Online (Sandbox Code Playgroud)

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

0
Run Code Online (Sandbox Code Playgroud)

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

31.8184719
Run Code Online (Sandbox Code Playgroud)

这是从墙上吸取的瓦数。

PS我使用了硬件能源监控插头来确认硬件监视器和实用程序之间报告的从笔记本电脑消耗的瓦数是相同的,ioreg如上所述 - 它们几乎相同,所以我有很高的信心表明这个方法是准确的。

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

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

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

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

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

这种方法的问题

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

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