バッテリー使用状況のログを取る

TaskerのWite Fileを使ってバッテリー消費量の推移をログファイルに書き出す。

今までは時報の際にバッテリー残量を表示させていたけど寝てる間に通知が溜まってしまって邪魔になるので、テキストファイル(CSV形式)で書き出すことにした。

2018/03/03 追記

1日出力させ続けてみたところ、%DATEに格納される日付フォーマットが年-月-日だったり日-年-月だったりとマチマチなので%DATE以外を使って日付を出力させることにした。

動作確認に使ったのはAndroid 7.1.1(Nougat)搭載のNexus6。
別端末のタブレット…Android 6.0(Mashmarrow)搭載のd-01J…では日付フォーマットが年-月-日固定だった。
Nexus6でのフォーマットのバラつきが、機種依存のものなのか、Androidのバージョンによるものなのか、設定の違いやアプリの違い(スマホ版とタブレット版?)なのか、根本的な原因がどこにあるのかは分からなかった。

以下は改良版のTASKの設計。

CSV形式のログファイルを出力するTASKを作る

リストに必要な要素は以下の通り。
CSV形式なのでカンマ区切りとする。

  • リスト番号
    • 3桁表記とする。桁が少ない場合は0を補完する
  • 年/月/日
    • 4桁/2桁/2桁とする。上述の通り%DATEは使わない
  • 日:時
    • 2桁:2桁とし、秒は不要。24時間表記とする
  • バッテリー残量
    • n%表記とする。%BATTをそのまま使う
  • ステータス
    • 充電開始、充電終了(完了ではない)、時報(鳩時計)、手動出力の4種

リスト番号を出力する

リスト番号を出力する。3桁表記で、桁が足りない場合は0を補完する。

リスト番号を格納する適当な変数名に、+ 1すれば呼び出す度に変数名に格納された数値+1される。
今回は%Countとした。大文字を1文字も含まないローカル変数だと呼び出す度に数値がリセットされる(より正確には保存されない)ので、必ず1文字以上の大文字を含んだ変数名を使うこと。

Variable Set [ Name:%Count To:%Count + 1 Recurse Variables:Off Do Maths:Off Append:Off ]

3桁表記にしたいので、条件分岐を使って%Countに0を補完して再度数値を書き込む。
条件分岐には以上/以下がないので、より大きい/より小さい/一致の3つを使って振り分ける。

  1. 00X … %Count < 10 (10より小さい)
  2. 0XX … %Count ~ 10 | %Count < 100(10と同じ or 100より小さい)
  3. XXX … %Count ~ 100 | %Count > 100(100と同じ or 100より大きい)

上から順にIf, Else Ifを使って分岐させるので、一番上の条件に満たない場合は2番目、2番目にも満たない場合は3番目というように分岐していく。
%Countが10より小さいか? → 10と同じ、もしくは100より小さいか? → 100と同じ、もしくは100より大きいか?の順で分岐する。
単純計算でログが999件になるには40日以上かかるので、月毎にログファイルを管理するなら4桁(1000以上)は考慮外とした。

使用する演算子は以下の4つ。

  • Matches ~ (一致)
  • Maths: Less Than < (より小さい)
  • Maths: Greater Than > (より大きい)
  • Maths: Equals = (イコール・Matchesで代替可能)

年/月/日, 日:時 のフォーマットで日時を出力する

%DATEが使えないので以下の方法を使用する。

GoogleのフォーラムにあったJava-Scripletのコードを一部修正して、年/月/日, 時:分のフォーマットを変数に格納する。

var now = global('TIMEMS');
var mydate = new Date(parseInt(now));
var logtimestamp = ((mydate.getFullYear()).toString()).slice(-4) + '\/' + ('0' + (mydate.getMonth()+1)).slice(-2) + '\/' + ('0' + mydate.getDate()).slice(-2) + ', ' + ('0' + mydate.getHours()).slice(-2) + ':' + ('0' + mydate.getMinutes()).slice(-2);

ステータスを出力する

ここまでを基本形として、充電開始/充電終了/時報/手動出力の4パターンに増やす。
Write Fileを全て書き換えるのが手間なので、%statusにステータスを格納して、Write Fileで書き込む。

Write File [ File:Tasker/cache/Batt-Log.txt Text:%Count, %logtimestamp, %BATT%, %status Append:On Add Newline:On ]
  • 充電開始 … charge-in
  • 充電終了 … charge-out
  • 時報 … hato
  • 手動出力(チェック) … check

Description

BatteryLog @ 充電開始
	A1: Variable Set [ Name:%status To:charge-in Recurse Variables:Off Do Maths:Off Append:Off ] 
	A2: JavaScriptlet [ Code:var now = global('TIMEMS');
        var mydate = new Date(parseInt(now));
        var logtimestamp = ((mydate.getFullYear()).toString()).slice(-4) + '\/' + ('0' + (mydate.getMonth()+1)).slice(-2) + '\/' + ('0' + mydate.getDate()).slice(-2) + ', ' + ('0' + mydate.getHours()).slice(-2) + ':' + ('0' + mydate.getMinutes()).slice(-2); Libraries: Auto Exit:On Timeout (Seconds):45 ] 
	A3: Variable Set [ Name:%Count To:%Count + 1 Recurse Variables:Off Do Maths:Off Append:Off ] 
	A4: If [ %Count < 10 ]
	A5: Flash [ Text:00%Count, %logtimestamp, %status Long:On ] 
	A6: Write File [ File:Tasker/cache/Batt-Log.txt Text:00%Count, %logtimestamp, %BATT%, %status Append:On Add Newline:On ] 
	A7: Else If [ %Count ~ 10 | %Count < 100 ]
	A8: Flash [ Text:0%Count, %logtimestamp, %status Long:On ] 
	A9: Write File [ File:Tasker/cache/Batt-Log.txt Text:0%Count, %logtimestamp, %BATT%, %status Append:On Add Newline:On ] 
	A10: Else If [ %Count ~ 100 | %Count > 100 ]
	A11: Flash [ Text:%Count, %logtimestamp, %status Long:On ] 
	A12: Write File [ File:Tasker/cache/Batt-Log.txt Text:%Count, %logtimestamp, %BATT%, %status Append:On Add Newline:On ] 
	A13: End If 
	A14: Flash [ Text:System-lock @ 3sec. Long:On ] 
	A15: Wait [ MS:0 Seconds:3 Minutes:0 Hours:0 Days:0 ] 
	A16: System Lock 

%Countで条件分岐させて別変数に格納し、ひとつのWrite Fileで出力する方法をとっていたけど、0が補完されたりされなかったりでマチマチだったので、条件分岐させて別変数に格納せずそのまま出力することにした。
この方法で24時間で35件ほどのログ出力を行ったが、漏れなく0が補完されている。