最近MacBook Airのバッテリーが持たなくなってきたな~と思って、バッテリー状態を見るために「システムレポート」を見たり、「アクティビティモニタ」の「エネルギー」で確認したりしてました。
で、ちょっと物足りないのが、システムレポートはその時の情報のみですし、アクティビティモニタは推移をグラフで見られるものの過去12時間のみでしかも小さい。。。
ということで自分でMacのバッテリー状態を定期的に取得することにしました。
今回はその方法をご紹介いたします。
バッテリー状態を出力
まずバッテリー状態の取得ですが、これはMacの「ioreg」コマンドを使います。これをターミナルで実行するとなんかいろいろズラッと並びます。
Macのバッテリー状態を取得するにはこのコマンドに「l」オプションをつけて、grepで目的の情報を絞り込む、という方法で行います。
ioreg -l | grep MaxCapacity
上記では「完全充電時の容量(mAh)」を取得できます。
出力結果のイコール右部だけを後ほど取り出して保存します。
「MacCapacity」部分を以下のように変更して、必要な情報を取得します。ただし「充放電回数」については更にgrepで「Design」を除外します。
CurrentCapacity → 「残りの充電量(mAh)」
DesignCapacity → 設計時の最大充電容量
CycleCount | grep -v Design → 「充放電回数」
出力されたデータを整形して更に出力
前項で出力されたバッテリー状態データを文字列で取り出して保存します。
今回私はPHPでshell_execを使って行いました。
shell_exec('ioreg -l | grep MaxCapacity');
実際のコードでは、以下のように「=」でexplodeして、右側のみを直接取り出しました。
$data[] = explode('=', shell_exec('ioreg -l | grep MaxCapacity'))[1];
保存はいろいろ方法があると思いますが、私は日時を第1列に追加したCSV形式でecho出力しました。コード全体を以下に記述します。
<?php
date_default_timezone_set('Asia/Tokyo');
$data = array();
$data[] = date('Y-m-d G:i');
$data[] = explode('=', shell_exec('ioreg -l | grep MaxCapacity'))[1];
$data[] = explode('=', shell_exec('ioreg -l | grep CurrentCapacity'))[1];
$data[] = explode('=', shell_exec('ioreg -l | grep DesignCapacity'))[1];
$data[] = explode('=', shell_exec('ioreg -l | grep CycleCount | grep -v Design'))[1];
echo implode(",", array_map('trim', $data)) . PHP_EOL;
定期的に保存
次に、出力したデータを定期的に保存します。plistファイルを作成し、それをLaunchAgentsフォルダに保存、そして「launchctl」コマンドで登録して実行します。
まずplistファイルについて、詳細は割愛させて頂きますが、以下のようになります。「/path/to/」部分は適切に修正します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.sandalot.macbatterylog</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/php</string>
<string>/path/to/macbatterylog/macbatterylog.php</string>
</array>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Minute</key>
<integer>0</integer>
</dict>
<dict>
<key>Minute</key>
<integer>15</integer>
</dict>
<dict>
<key>Minute</key>
<integer>30</integer>
</dict>
<dict>
<key>Minute</key>
<integer>45</integer>
</dict>
</array>
<key>StandardOutPath</key>
<string>/path/to/macbatterylog/data/battery.log</string>
</dict>
</plist>
保存場所は、私の場合はホームフォルダ内の「~/Library/LaunchAgents」に保存しました。が、他にもいくつか候補があり、
/Library/LaunchAgents
/Library/LaunchDaemons
などでもOKです。
あとは「launchctl」コマンドで登録ですが、以下のようにloadを使います。
launchctl load /Users/(ユーザー名)/Library/LaunchAgents/com.sandalot.macbatterylog.plist
ちなみに登録を解除するにはunloadです。
launchctl unload /Users/(ユーザー名)/Library/LaunchAgents/com.sandalot.macbatterylog.plist
これでplistファイル内の「StandardOutPath」で設定したフォルダの「battery.log」ファイルに保存されていきます。
Githubで公開してます
というわけで、Macのバッテリー状態を取得して定期的に保存する方法をご紹介いたしました。
全コードはGithubで公開しています。
https://github.com/kei-sandalot/macbatterylog
この中にはグラフで表示する「index.php」も含まれています。PHPで「battery.log」からデータを取得してjqPlotで表示しています。
現状グラフはjqPlotの標準状態ほぼそのままでシンプルですし、PHPでデータを取得しているためWebサーバー内で動かす必要があると思います。
より簡単に実行できるようにJavaScriptでデータを取得するようにすれば良いなと思いますが・・・それはまたいずれ。