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 くらいでした.