iPhoneのバッテリー情報を取得するコマンド『batteryinfo』(要JB) - iPhone.goodegg.jp

ホーム > 未分類 > iPhoneのバッテリー情報を取得するコマンド『batteryinfo』(要JB)

iPhoneのバッテリー情報を取得するコマンド『batteryinfo』(要JB)


バッテリーログ(App Store)にログを自動追記したいので作ってみました。ついでにブログのサイドバーにバッテリー情報を出してみたり…ここまでいじれるiPhoneはやっぱり面白い。

 
当記事は脱獄(Jailbreak)に関する情報を扱っています。脱獄及び記事内容の実施は、自己の責任において御願い致します。また以下の関連記事をご覧頂くことをオススメしております。
 

batteryinfo

インストール方法

無保証です。iPhone OS 2.2.1で動作確認しました。ソースコードも添付するので許せない部分はお直しください。

コマンドラインオプション

-s		電源を表示します。 (AC Power/Battery Power)
-c		充電中かどうかを表示します。 (1 = 充電中)
-p		バッテリーの残量を表示します。単位は%です。(0-100)
-w [FILENAME]
		FILENAMEにバッテリーログ(App Store)のSqliteファイルを指定するとログを書き込みます。
		/private/var/mobile/Applications/???/Documents/BatteryLog.db
		???の部分は以下のコマンドなどで探せます。
		find /private/var/mobile/Applications/* -name “BatteryLog.app”とかで探せます。

バッテリーログ(App Store)に自動ログ書込み

バッテリーログ(App Store)の開発/販売元と当サイトは一切関係ありません。この設定によってバッテリーログ(App Store)の動作を阻害したり、バージョンアップにより正常に動作しなくなる可能性があります。当設定に関して、バッテリーログ(App Store)の開発/販売元への問い合せはお控え頂き、自己の責任において実施ください。  

設定ファイルの設置方法

設定内容については後述します。適宜パス等を変更してご利用ください。
  1. 設定ファイルをダウンロード
  2. battlogger.shを適当なディレクトリを作成してコピー。私は以下に置いてます。
    • /var/root/Script/battlogger/battlogger.sh
  3. battlogger.shを書き換え。
    • SQLITE3_FILE=”/private/var/mobile/Applications/???/Documents/BatteryLog.db”
    • ???の部分はfind /private/var/mobile/Applications/* -name “BatteryLog.app”とかで探せます。
  4. battlogger.shに実行権限を付ける。
    • chmod 755 battlogger.sh
  5. jp.goodegg.battlogger.plistを/System/Library/LaunchDaemons/にコピー。
    • battlogger.shのパスをご確認ください。
    • ファイルの所有者が以下である必要があるようです。
      chown root:wheel /System/Library/LaunchDaemons/jp.goodegg.battlogger.plist
  6. battlogger.shへのパスを確認する。
  7. 設定ファイルをロードする。
    • launchctl load /System/Library/LaunchDaemons/jp.goodegg.battlogger.plist

jp.goodegg.battlogger.plist

Launchdでシェルスクリプトを定期的に呼び出すための設定ファイルです。実行間隔は5分に1回にしてます。StartIntervalは秒数で指定します。ここで指定する秒数=ログ書込間隔ではありません。(シェルスクリプトで、前回のログ追記からの経過時間を見てます。)




        Label
        jp.goodegg.battlogger
		ProgramArguments
		
	        /var/root/Script/battlogger/battlogger.sh
 		
        StartInterval
        300


 

battlogger.sh

もっとスマートな方法があるんでしょうが…シェルスクリプトで逃げました。これでだいたい納得いくログが書ける?
#!/bin/sh

##
##!!!書き換えて下さい!!!
##ここは自分の環境に合わせて書き換えます。
##バッテリーログのデータベースファイルを指定してください。
##
SQLITE3_FILE="/private/var/mobile/Applications/???/Documents/BatteryLog.db"

##カレントディレクトリをスクリプト設置場所に。
cd $(cd $(dirname $0);pwd)

##現時点のバッテリー残量と電源を取得。
/usr/bin/batteryinfo -p -s > battery_now

##前回更新時点の情報がなければ作る。
if [ ! -e battery_old ]; then
	touch  -t `date -d '1 days ago' +"%Y%m%d%H%M.%S"` battery_old
fi

##前回更新から30分経過しているか
UPDATE_FLG=$(find battery_old  -mmin +30)
##前回の電源
OLD_POWER_STATUS=$(tail -n 1 battery_old)
##今回の電源
NEW_POWER_STATUS=$(tail -n 1 battery_now)

##前回更新より30分以上経過している※1 もしくは 電源が変ったとき※2
##※1 ログの書込間隔が短すぎても無駄なので。
##※2 充電の終了時点をできるだけ取得するため。
if [ ! -x $UPDATE_FLG ] || [ "$OLD_POWER_STATUS" != "$NEW_POWER_STATUS" ]; then
	STR_DATE=`date  +"%Y/%m/%d %H:%M:%S"`
	##バッテリーログ書込※3
	/usr/bin/batteryinfo -p -w $SQLITE3_FILE
	##現時点の情報を次回チェックに備えて保存
	mv battery_now battery_old
fi
exit 0
  こんな感じで定期的に書き込まれていきます。ログをみながら徐々に調整していきます。    

ブログのサイバーにバッテリー状態を表示

ついでに最新のバッテリー状態をブログのサイドバーに表示してみる。特に意味はないんですが…電池ないとき電源を恵んでください。   以下は画像ファイルです。実際の表示は左サイドバーの一番下をご覧ください。   まずはサーバにアップロードするように変更して…(電池の無駄…)
##battlogger.shの※3の部分を以下のように変更して...FTP送信してます。
(echo $STR_DATE",";/usr/bin/batteryinfo -p -w $SQLITE3_FILE) | tr -d '\n' > battery_latest
curl -T battery_latest ftp://送信先サーバアドレス/ディレクトリ/battery_latest --user ユーザ名:パスワード
  後はテキストファイルを読込むPHPを書いて…
<?php

#ログファイルのありか
define("FILENAME", "/dir/dir/foo.log");
#画像ディレクトリを指定。このサンプルでは...
define("IMGDIR", "/dir/dir/img/");
#配列要素.pngってファイルを用意した。
$BATTERY = array(0,6,12,18,25,32,38,44,50,56,63,69,75,82,88,94,100);

try
{
	$img ="";
	$fp = fopen (FILENAME, "r");
	if(!$fp)
	{
		throw new Exception("");
	}

	while(!feof($fp))
	{
		$line = fgets($fp);
		$str = explode(",", $line);
	}
	fclose($fp);
	if(is_numeric($str[1]))
	{
		for($i=0;$i<count($BATTERY);$i++)
		{
			if ($str[1] == 100)
			{
				$img = "100";
				break;
			}
			elseif ($str[1] == 0)
			{
				$img = "0";
				break;
			}

			if ($str[1] >= $BATTERY[$i] && $str[1] < $BATTERY[$i+1])
			{
				$img = $BATTERY[$i];
				break;
			}
		}
	}
	ShowWidget($img,$str[0],$str[1]);
}
catch (Exception $ex)
{
	ShowWidget("e","","");
	fclose($fp);
}


function ShowWidget($img,$dte,$per)
{
	header("Content-type: application/x-javascript");
	print "document.write('<div align=\"center\"><img src=\"" . IMGDIR . htmlspecialchars($img) . ".png\" width=\"150\" height=\"80\" />');";
	print "document.write('<div class=\"widget-footer\">');";
	if($dte != "")
	{
		print "document.write('<small>" . htmlspecialchars($dte) . " " . htmlspecialchars($per) . "%</small><br>');";
	}
	print "document.write('<a href=\"/archives/3625\"><small>これは何?</small></a>');";
	print "document.write('</div></div>');";
}

?>
  サイトバーに表示させました。
<script type="text/javascript" src="/dir/dir/file.php"></script>
 

バッテリーログ(App Store)を使わない方法

YYYYMM.logに”日時,バッテリー残量\n”の形式でログを書くだけなら…バッテリーログ(App Store)はいりません。
FILENAME=`date  +%Y%m.log`
WRITEDATE=`date  +"%Y/%m/%d %H:%M:%S"`
cd $(cd $(dirname $0);pwd)
(echo $WRITEDATE",";batteryinfo -p) | tr -d '\n' >> $FILENAME
echo -e "" >> $FILENAME

バッテリーログ(App Store)について

2009年3月14日現在350円です。非JB環境では手動で取得が必要ですが…それでもバッテリーが気になる方には有益なアプリかと思います。

iPhoneのバッテリーについて

http://www.apple.com/jp/batteries/iphone.html  
  • てんごく

    素晴らしい!

  • 緑園住民

    こ、これはすばらしす!!早速ためしてみると便利ですねぇ!!
    他のアプリ(迷惑がかからない程度)にも応用できそうですねぇ!!

  • emanon

    >jp.goodegg.battlogger.plstを/System/Library/LaunchDeamons/にコピー。

    このあとに、
    # chown root:wheel jp.goodegg.battlogger.plist
    しないと動かないですね。。ちょいと悩みました。
    後本文コピペでやってたので、
    jp.goodegg.battlogger.plst ←.plist とか
    Deamon ←Daemon とか少しハマリました。

    しかし、おかげでこうだったらいいのにと思ってたことが実現!すばらしいっす。

    あ、あとは install.sh で一発設定できるようにしたので再インストールは大丈夫 d:D
    #!/bin/sh
    cp -p batteryinfo /usr/bin/
    chmod 755 /usr/bin/batteryinfo
    cp -p battlogger.sh /var/root/battlogger/
    chmod 755 /var/root/battlogger/battlogger.sh
    cp -p jp.goodegg.battlogger.plist /System/Library/LaunchDaemons/
    chown root:wheel /System/Library/LaunchDaemons/jp.goodegg.battlogger.plist

    launchctl load /System/Library/LaunchDaemons/jp.goodegg.battlogger.plist

    わざわざ載せるまでもないですが :p

  • goodegg

    > emanon san
    手順抜け、スペルミスのご指摘大変助かります。ありがとうございます!!!
    iPhone内で書いて手順想定していたので…一応確認したけどやっぱり抜けてた!
    すみません。

  • http://candy.zapto.org/hareta/ ハレタ

    ブログのサイドバーに表示はいいですね
    すっごく欲しいです.

  • goodegg

    >ハレタ san
    こんばんは!

    何の意味があるか私もわからないのですが…楽しいのでヨシとします。

    公開前提じゃないので汎用的に書いてませんが…
    iPhoneからサーバに送ったログ読んで出力するソースを貼り付けました。

    とりいそぎっす。

  • Lunar@

    有用なスクリプトの公開、本当にありがとうございます。
    3.0JBでも正常に動きました。
    これからもRSS等で拝見させていただきます。
    お邪魔しました。

  • face

    いつも勉強させてもらっています。ありがとうございます。
    実は、OSを3.0にして記事のBatteryLogを使っておりましたが
    BatteryLogがバージョンアップされたようで、ログ取得のスクリプト起動時にエラーが発生します。

    エラー内容:
    ERROR: sqlite3_step table battery_log has 15 columns but 13 values were supplied

    sqlite3のdbの中身を確認しますと、カラムが2つ追加されているようです。(batteryLevel(int)、logStatus(int))
    もう脱獄されていないようですので、自分でソースからコンパイルしたらいいのですがうまくいかず・・・
    以下の修正でコンパイルして頂けませんでしょうか。
    どうぞ宜しくお願いします。

    main.m(316行)
    “insert into battery_log values (null,datetime(‘now’),?,?,?,0,?,?,?,0,0,null,null,0,0);”

    たぶんこれで動くと思います。

  • Lunar@

    私からもよろしくお願いいたします。
    しばらくは前バージョンで使います。

  • goodegg

    >Lunar@ san
    >face san

    ご愛用者がいるとは…感激です。
    Lunar@さんの的確な調査も感謝します。main.m(Line:38)

    ただ、現在どうしてもiPhone/iPhone 3GSをJBできない理由があるのです。(JB向けのアプリはいつもネイティブコンパイル)

    今やっていることが片付けば3GをJBして…との野望もありますが…まだ予定が見えてないです。

    即座の対応ができず恐れ入りますが、Todoには入れておくので何卒ご容赦ください。

  • face

    ごんにちは。
    ご返信ありがとうございます。
    動作確認はこちらでさせて頂きますので、JBされなくても316行目の修正のみでコンパイルだけお願いできませんでしょうか。
    ご無理申し上げてスイマセン。どうぞ宜しくお願いします。

  • goodegg

    > face san

    コンパイル環境をiPhone上に構築して、ネイティブビルドしてました。クロスコンパイル環境は作ったことないのでスタートラインは同じかもです。(なおのこと確認が…)

    とりいそぎ。

  • face

    おお! ご無理申しまして大変恐縮です。ありがとうございます。
    ぜひ使わせて頂きたいです。宜しくお願いします

  • face

    あ、勘違いしました;;
    ネイティブコンパイルしていた=JBしていないので不可能
    と言う意味だったのですね。。。大変失礼しました m(_ _)m

  • Lunar@

    ご丁寧なレスありがとうございました。
    JB化および、リコンパイル心待ちにしています。
    それまではなんとか前バージョンで持たせます。
    来る日までよろしくおねがいします

  • aya

    セルフコンパイルしようと思ったら、libgccが無いよと言われてしまいましたorz
    海外のフォーラムをちょっと覗いてみたら、OS3.0では出ていないらしいです…。
    batteryinfoが使えないのは結構痛いですねぇ…。

  • face

    そうなんです。
    3GSからなのかわかりませんがlibgccで蹴られてしまいます。
    クロスコンパイル環境作るしかなさそうです (;´д`)

  • goodegg

    Twitter上でiPhone OS 3.0でのコンパイル方法を教えて頂きました!

    RT @takamii libgccのdebファイルをiPhoneに転送してdpkgすると、Toolchainもgccも入れれるようになりました。http://bit.ly/UBcbs

    本当にありがとう! > @takamii
    まだJB環境作れそうもないので…ものすごく助かります。

  • emanon

    faceさんのコメントを参考に
    main.m
    “insert into battery_log values (null,datetime(’now’),?,?,?,0,?,?,?,0,0,null,null,0,0);”
    でOS3.1.2上でセルフコンパイル出来たのですが、バッテリー状態は取得しているものの、BatteryLog.dbの更新が出来ない。
    ただ、コンパイル環境もtoolchain2.0に(適当に)足りないものを足しただけなのでそっちが原因かもしれません。謎。。。

  • emanon

    emanon 09-12-15 (火) 13:39 のコメントした状態で
    # /usr/bin/batteryinfo -w /private/var/mobile/Applications/???/Documents/BatteryLog.db
    ERROR: sqlite3_step no such column: ’now’

    となります。
    main.m(Line:38)
    “insert into battery_log values (null,datetime(’now’),?,?,?,0,?,?,?,0,0,null,null,0,0);”

    datetime(’now’)が原因?
    いまさら、かもしれませんが誰か分かる方いらっしゃいますでしょうか?

  • http://twitter.com/takamii takamii

    いつだったかのバージョンからさらにメモ欄が追加されています。
    自分は以下の変更で動作していますが最近のアップデートでDB構造がどう変わってるか調べていないので変なことをしている可能性はあります^^

    38行目
    insert into battery_log values (null,datetime(‘now’),?,?,?,0,?,?,?,0,0,null,null,?,null,null);”

    136行目の次に以下を追加
    sqlite3_bind_int(pstmt,7,percent);

  • emanon

    takamiiさま

    やはりビルド環境の構築が上手くいってないのか、データベースファイルの更新がダメなようです。
    バッテリ情報は取得できているので、クロスコンパイル環境の構築を含め、もう一度見直してみます。

  • 通りすがり

    非常に素晴らしいです。
    JBならではのHACKですね。

    DB構造は外出しにされては如何でしょうか?

ホーム > 未分類 > iPhoneのバッテリー情報を取得するコマンド『batteryinfo』(要JB)

サイト内検索
更新情報
Ads
アクセス元ランキング
相互リンク
ブログパーツ
あわせて読みたいブログパーツ

 フィードメーター - iPhone.goodegg.jp

Return to page top