iPhoneのバッテリー残量を取得
iPhoneのバッテリーがかなりヘタってちょっと使うとすぐに電源が落ちてしまうようになってしまったので、自分で交換してみました。やり方を紹介したページを見つつ、バッテリー\2000 + 工具セット \1000 で無事交換成功し、日中そこそこ使っても丸一日持つようになりました。
DIGIFORCE 交換用PSEバッテリー iPhone6用 1810mAh LPB-DIGI6
- 出版社/メーカー: DIGIFORCE inc.
- メディア: エレクトロニクス
- この商品を含むブログを見る
iPhone スマホ 携帯電話 修理キット 修理ツール オープニングプライヤー ドライバー 工具 セット iPhone6 Plus 7 6S 5 5S
- 出版社/メーカー: Barsado
- メディア: エレクトロニクス
- この商品を含むブログ (1件) を見る
さて、バッテリーの寿命を良くする方法として、80〜90%ほど充電されたら繋ぎっぱなしにせずに充電をやめると良いという説があるようです。真偽のほどは定かではありませんし、大きな効果があるならそういった機能が実装されているでしょうから、おそらくいちいち気にするほどの効果はないのでしょう。とはいえ、意識しなくとも自動的に充電が止まってくれるのならそうしてみても良いかな?という気になったので、やり方を考えてみました。
まず、iPhoneのバッテリー残量を取得する方法ですが、なんらかのアプリを使えないでしょうか? しかしiOSの場合、アプリがバックグラウンドで定期的に処理をするのは、アクセサリへのアクセスや、音楽再生や位置情報を使用するアプリに限られており、電池監視のためにはトリッキーなことをする必要があるので候補から外しました。
次に考えられるのはUSB越しで取得する方法です*1。最近のLinuxデスクトップ(Fedora 25で確認)にiPhoneをUSB接続すると、upowerコマンドでiPhoneのバッテリー値を取得できます。下記はiPadの場合ですが、まず一覧で名前を確認し、
$ upower -e
/org/freedesktop/UPower/devices/computer_3_1
/org/freedesktop/UPower/devices/mouse_0003o046Do1024x000A
/org/freedesktop/UPower/devices/keyboard_0003o046Do2011x000B
/org/freedesktop/UPower/devices/DisplayDevice
それっぽいデバイスを指定すると、
$ upower -i /org/freedesktop/UPower/devices/computer_3_1 native-path: /sys/devices/pci0000:00/0000:00:14.0/usb3/3-1 vendor: Apple_Inc. model: iPad serial: ***************************************** power supply: no updated: 2016年12月31日 22時16分52秒 (14 seconds ago) has history: yes has statistics: no computer warning-level: none percentage: 100% icon-name: 'battery-full-charged-symbolic'
という感じで情報が出力されるので、このpercentageを見るというのが一つの方法です。GUIで設定(gnome-control-center)→電源 で残量を確認できるのもこの情報を表示しています。
これを見て、80%を超えたらUSBの電源をOFFにする方法が取れるでしょう。LinuxからのUSBの電源制御には、最近だと以下のハブが使えるそうです。
LinuxからUSB HUBの電源のON/OFFを制御してみる - memoメモ
ただ欠点として、USBから切断してしまうとそれ以降の情報は取れないので、充電完了後に使用していると電池が減っていってしまうということになります*2。
別のやり方として、iTunesをインストール済みのMacまたはWindowsであれば、libimobiledeviceを導入することで、Wi-Fi経由でも電池残量などの情報が取得できます。たまたまWiFiで電源をON/OFFできるコンセントを作ってあったので、全てWiFi越しでやれるということもあり、今回はこの方法を試してみました。
まず、libimobiledeviceを導入します。Macであればbrewで一発です。とはいえiOS10のせいか、HEADでないとうまく動作しませんでした。
$ brew install --HEAD libimobiledevice
これで、
idevice_id -l コマンドでUSBまたはWiFiで繋がっているiOSデバイスのシリアルを調べておき、ideviceinfoでバッテリー情報を取得します。
$ ideviceinfo -u ****************(idevice_idで表示されたシリアル) -q com.apple.mobile.battery BatteryCurrentCapacity: 100 BatteryIsCharging: false ExternalChargeCapable: true ExternalConnected: true FullyCharged: false GasGaugeCapability: true HasBattery: true
BatteryCurrentCapacityが%単位でのバッテリー残量です。
rubyであれば
$IDEVICEINFO_CMD = '/usr/local/bin/ideviceinfo' def get_batt(device_id) result = `#{$IDEVICEINFO_CMD} -u #{device_id} -q com.apple.mobile.battery` if result =~ /BatteryCurrentCapacity:\s*(\d+)/ return $1.to_i end nil end
というような関数でバッテリー残量を取得できるようになります。
ただし,iPhoneがスリープ状態になっている場合、WiFiには90〜300秒に一度、数秒間しか接続されないようで、この瞬間しか情報がとれません。とりあえず、2秒に一度くらいポーリングをかけることにします*3。また、それでもかなり長いことWiFiに接続してこないこともあるようなので、そのような場合には一度充電をOFF→ON(またはON→OFF)することで、iPhoneをウェイクアップさせれば情報がとれます*4。
この結果を見て、80%以上で充電停止、80%未満で再開するようにします。また、充電中にMacがスリープしてしまうと充電されっぱなしになるので、充電中はcaffeinateコマンドでスリープを抑制しています。全体的にはこんなスクリプトになりました。
30%充電の状態からこのスクリプトを動かしながら充電を試して見た結果、こんな感じになりました。運悪く80%になるわずか手前でWiFi接続が切れたらしく、80%を3%ほど超えたところで充電が止まりました。
そのままiPhoneを使っていると、79〜80%で維持されるように充電がON/OFFされます。
でもこれ結局充放電してるわけで、バッテリーに優しい気はしない。。まあ、あくまで実験ということで。