2011年5月2日月曜日

Thinkpad X61 でピークシフト機能を使う

Thinkpad X61 でピークシフト機能を使う


Thinkpad にはピークシフト機能が搭載されています. [*]
ピークシフトとは電力使用量が多い時間帯に AC アダプターからの電力供給をカットしバッテリー駆動にすることでその時間帯の電力消費を抑える機能です.
Windows ではソフトウェアが提供されているらしいのですが,Linux ではどうやるんだろうということで調べてみました.

[*]http://www-06.ibm.com/jp/pc/environment/peakshift.shtml

tp_smapi

ThinkPad のことを調べたいと思ったら,まず ThinkWiki です.
探してみたところ,tp_smapi というカーネルモジュールがありました.

http://www.thinkwiki.org/wiki/Tp_smapi

インストール

Gentoo では app-laptop/tp_smapi というパッケージがあるので,一発で入ります.

$ sudo emerge -av app-laptop/tp_smapi

もし,kernel の方で HDAPS を Y もしくは M として利用しているのであれば外しておいた方がいいようです.
外した上で,tp_smapi の hdaps use-flag をオンにしましょう.
外さなくても,利用することは出来ますが,モジュールをロードするときに以下のようなメッセージがでてロードできないことがあるようです.

thinkpad_ec: cannot claim IO ports 0x1600-0x161f... consider using force_io=1.

この場合は /etc/modprobe.d/hoge.conf に以下のような記述を追加しておけば利用できます.

options thinkpad_ec force_io=1

使い方

まずはモジュールをロードします.

$ sudo modprobe tp_smapi

ロードすると,/sys/devices/platform/smapi/ ができます.

$ ls /sys/devices/platform/smapi/
BAT0  BAT1  ac_connected  driver  modalias  power  smapi_request  subsystem  uevent

$ ls /sys/devices/platform/smapi/BAT0
-rw-r--r-- 1 root root 4096 May  1 20:44 barcoding
-rw-r--r-- 1 root root 4096 May  1 20:44 charging_max_current
-rw-r--r-- 1 root root 4096 May  1 20:44 charging_max_voltage
-rw-r--r-- 1 root root 4096 May  1 20:44 chemistry
-rw-r--r-- 1 root root 4096 May  1 20:44 current_avg
-rw-r--r-- 1 root root 4096 May  1 20:44 current_now
-rw-r--r-- 1 root root 4096 May  1 20:44 cycle_count
-rw-r--r-- 1 root root 4096 May  1 20:44 design_capacity
-rw-r--r-- 1 root root 4096 May  1 20:44 design_voltage
-rw-r--r-- 1 root root 4096 May  1 20:44 dump
-rw-r--r-- 1 root root 4096 May  1 20:44 first_use_date
-rw-r--r-- 1 root root 4096 May  1 21:05 force_discharge
-rw-r--r-- 1 root root 4096 May  1 20:44 group0_voltage
-rw-r--r-- 1 root root 4096 May  1 20:44 group1_voltage
-rw-r--r-- 1 root root 4096 May  1 20:44 group2_voltage
-rw-r--r-- 1 root root 4096 May  1 20:44 group3_voltage
-rw-r--r-- 1 root root 4096 May  1 20:44 inhibit_charge_minutes
-rw-r--r-- 1 root root 4096 May  1 20:44 installed
-rw-r--r-- 1 root root 4096 May  1 20:44 last_full_capacity
-rw-r--r-- 1 root root 4096 May  1 20:44 manufacture_date
-rw-r--r-- 1 root root 4096 May  1 20:44 manufacturer
-rw-r--r-- 1 root root 4096 May  1 20:44 model
-rw-r--r-- 1 root root 4096 May  1 20:44 power_avg
-rw-r--r-- 1 root root 4096 May  1 20:44 power_now
-rw-r--r-- 1 root root 4096 May  1 20:44 remaining_capacity
-rw-r--r-- 1 root root 4096 May  1 20:44 remaining_charging_time
-rw-r--r-- 1 root root 4096 May  1 20:44 remaining_percent
-rw-r--r-- 1 root root 4096 May  1 20:44 remaining_percent_error
-rw-r--r-- 1 root root 4096 May  1 20:44 remaining_running_time
-rw-r--r-- 1 root root 4096 May  1 20:44 remaining_running_time_now
-rw-r--r-- 1 root root 4096 May  1 20:44 serial
-rw-r--r-- 1 root root 4096 May  1 20:44 start_charge_thresh
-rw-r--r-- 1 root root 4096 May  1 20:44 state
-rw-r--r-- 1 root root 4096 May  1 20:44 stop_charge_thresh
-rw-r--r-- 1 root root 4096 May  1 20:44 temperature
-rw-r--r-- 1 root root 4096 May  1 20:44 voltage

色々ありますが,いくつか説明します.

state
現在の状態. discharging, charging, idle の3種類
remaining_percent
バッテリー残量(%)
start_charge_thresh

充電を開始する閾値.

echo 70 > start_charge_thresh

とすると,70% 以下になったときに充電を開始する.

stop_charge_thresh

充電を停止する閾値

echo 90 > stop_charge_thresh

とすると,90%になった段階で充電が止まる.

force_discharge

放電モードにする. ACアダプタをつけてるときに機能します.

1 を入れるとこの機能が働き,ACアダプタをつなげていてもバッテリー駆動になります.

inhibit_charge_minutes
指定した時間(分)の間,充電を停止する.

これらのうち,force_discharge と inhibit_charge_minutes あたりの機能が使えそうです.

tp_peakshift

というわけで,簡単なスクリプトを書いてみました.
Yahoo!Japanの電気予報APIを利用し,1時間後もしくは2時間後の消費電力予測を見て 95% を超えたときに電池駆動モードに移行もしくは充電の停止をするものです.



使い方

スクリプトを /etc/cron.hourly/ 以下に放り込んで実行権限をつけてください.

欠点

force_discharge をオンにした状態でバッテリーが空になると,自動的に充電が始まってしまう.
充電が始まると,通常使用分+充電で余計に電力を使用してしまうので逆効果になってしまう場合がある.
バッテリーが空になったときは inhibit_charge_minutes に適当な値を自動的に入れるような仕組みが欲しいところ.


ThinkPad X61 での動作は確認しています.
他の機種でも動くとは思いますが判りません.


参考までに,通常使用時が 20W〜25W ほどで充電中は 55W〜60W くらいでした.