アプリ実行時の消費電力チェックを自動化する検討

##1. はじめに
スマホのアプリをバージョンアップしたら急に電池の減りが早くなった、、、なんてのは嬉しくないですよね。そこで、アプリ実行時の消費電力をチェックできるようにして、無駄に電力を消費するような不具合を入れ込んでも検出できる(かもしれない)方法を検討します。

##2. 方針
スマホやタブレットなどの端末に供給している電力は[USB充電チェッカー](https://www.google.co.jp/search?hl=ja&as_q=USB充電チェッカー)で可視化できます。このチェッカーでログを取りながらアプリを操作する、あるいは操作のたびに測定することでふだんとは異なる挙動をスクリーニングすることを考えます。

また、端末はさまざまなソフトウェアがバックグラウンドで動くのでふだんより消費電力が増えてもそれだけではフォアグラウンドのアプリの不具合と言えませんが、自動化して回数を繰り返せるようにしてそれがたまたまなのか再現性があるかを切り分けしやすくすることを狙います。

##3. USB充電チェッカー
USB充電チェッカーは数百円から数千円までさまざまなモデルがありますが7セグLEDやLCDに電圧や電流が表示されるのが基本的な機能となります。値段が上がるにつれて表示を回転できたり、グラフを描画できたり、データを記録できるなど高機能になるようです。

チェッカーそのものを自作したりチェッカーの表示部分をWebカメラで撮影しOCRで値を切り出したりといったアプローチは電子工作としては面白そうですが大変なので、既製品を流用し実現の敷居を下げたいと思います。

[AREA(エアリア)](https://www.area-powers.jp/index.html)から発売されている[SD-WWC01](https://www.area-powers.jp/product/others/4580127696875/)はリンク先を見ていただくと分かるようにカラーLCD搭載のとても高機能なモデルで、自動化に好都合な以下の特徴を備えています。

- 電圧や電流のデータをPCに取り込める
  - PCとの接続はBluetooth
  - 技適(技術基準適合証明)取得済み([工事設計認証番号210-119723](https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jg01_01&PC=210&TC=N&PK=1&FN=190111N210&SN=%94F%8F%D8&LN=170&R1=*****&R2=*****))
- 中身はHangZhou RuiDeng Technologies(杭州睿登科技有限公司)の[UM24C](http://www.ruidengkeji.com/product/leixing/shuangmiantixudaopian/USBcaipingce/2015/0126/37.html)で有志により通信パラメータが解析されている

UM24Cとの違いは、SD-WWC01は技適を取得していることと容易に分解できないように筐体にトルクスネジを使用していることです。
![sd-wwc01_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221758/7a07f291-221a-4020-5023-bcf16883972d.jpeg)

##4. 電圧・電流の読み出し
値の読み出しは「[Bluetoothで値が読めるUSB電圧・電流モニター「UM24C」を使ってiPhone Xの充電状況を測ってみる](http://neocat.hatenablog.com/entry/2018/04/14/232221)」を参考にさせていただきました。

- Bluetooth SPPで接続する(ボーレートは9600bps)
- コマンドの送受信はバイナリで行う
- 0xf0を送信すると約130バイトのバイナリが返ってくる
- 受信したデータの3バイト目と4バイト目に電圧のデータ、5バイト目と6バイト目に電流のデータが16bitで格納されている

「[Arduino治具とオシロスコープをRaspberry Piに接続してテストベンチを組み、Jenkinsでテストを自動化する](https://qiita.com/pbjpkas/items/c33c6c55a927eccc4d85)」で構築したテストベンチへの組み込みを想定し電圧と電流を取得するプログラムをpythonで作成しました。実行環境はWindows Subsystem for LinuxのUbuntu18.04のpython3であらかじめ[PySerial](https://www.google.co.jp/search?hl=ja&as_q=PySerial)をインストールしてあります。COMポート番号は筆者の環境の値を決め打ちで記述しています。

```python:read_sdwwc01.py

import serial

h = serial.Serial("/dev/ttyS5",baudrate=9600,timeout=0.5)

h.write(b"\xf0")
rx = h.readline()

#raw data
print(f'0x{rx[2]:02x}{rx[3]:02x}')
print(f'0x{rx[4]:02x}{rx[5]:02x}')

v = float(rx[2]<<8|rx[3])/100.0
i = float(rx[4]<<8|rx[5])/1000.0
w = v * i

print(f'V:{v:.2f} [V]')
print(f'I:{i:.3f}[A]')
print(f'W:{w:.2f} [W]')

h.close()

```

以下はSD-WWC01で測定しながらスマホ(Windows 10 Mobile)のEdgeでYouTubeを視聴している様子です。
![sd-wwc01_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221758/afd73488-47c7-92df-829f-9424ec191828.jpeg)

```:実行結果(例)
kas@ThinkPad:/mnt/c/jenkins/workspace/tmp$ python3 read_sdwwc01.py
0x01f2
0x0236
V:4.98 [V]
I:0.566[A]
W:2.82 [W]
```

##5. おわりに
端末に供給している電力をUSB充電チェッカーSD-WWC01と20行程度のpythonのスクリプトで取得でき、アプリ実行時の消費電力をチェックできそうなことがわかりました[^1]。

消費電力のチェックはシステム動作をさせることで初めて可能になります。システムレベル、かつ、非機能のテストはわりと自動化が難しい印象があるのですが既製品の活用で敷居を下げられました。この方法はUSBの給電ラインにチェッカーを挟むだけなので端末に限らずUSBで給電するIoTデバイス(のファームウェア)などにも汎用的に使える期待があります。アプリの操作を含むシステム全体の自動化は改めて検討したいと思います。

[^1]: 実際にチェックを行うにはあらかじめ端末を充電しておいたり画面の明るさを固定したりといった諸々の準備が発生するものと思います。