サーバ機としてUbuntuを入れて使っているパソコンにPaSoRiが搭載されていたのでいろいろ記録しようとした話です。Suicaって定期にもなるし電子マネー機能もあるしで自分でデータ取得出来たら捗る気がしませんか?
LinuxでPaSoRiを使う
WindowsではSuicaなどからデータを取り出せるSFCard ViewerがSonyから公開されていますが、Linuxでも扱いたいと思ったところDebianで使えるlibpafeを発見しました。このライブラリ自体はCによるものですが、Rubyによるラッパーライブラリlibpafe-rubyも公開されているので組み合わせることでいい感じにいじれるのではないかと思った次第です。
ライブラリの導入
libpafe
ソースを持ってきてビルド、インストールします。ビルド前に apt install libusb-dev
で依存パッケージをインストールしておきます。
# cd /usr/local/src
# git clone https://github.com/rfujita/libpafe.git
# cd libpafe
# ./configure && make && make install
共有ライブラリが更新されない場合があるっぽいのでlibpafeのインストール後に改めてldconfig
を実行しておくとよいでしょう。
tests
以下にあるファイルで動作を確認します。
# ./tests/pasori_test
PaSoRi (RC-S320)
firmware version 1.40
Echo test... success
EPROM test... success
RAM test... success
CPU test... success
Polling test... success
udev
/lib/udev/rules.d/60-pasori.rules
を新規作成し、以下の内容を追加します。
ACTION!="add", GOTO="pasori_rules_end"
SUBSYSTEM=="usb_device", GOTO="pasori_rules_start"
SUBSYSTEM!="usb", GOTO="pasori_rules_end"
LABEL="pasori_rules_start"
ATTRS{idVendor}=="054c", ATTRS{idProduct}=="006c", MODE="0664", GROUP="dev"
ATTRS{idVendor}=="054c", ATTRS{idProduct}=="01bb", MODE="0664", GROUP="dev"
ATTRS{idVendor}=="054c", ATTRS{idProduct}=="02e1", MODE="0664", GROUP="dev"
LABEL="pasori_rules_end"
続いて設定をリロードしてから再起動します。
$ udevadm control --reload-rules
$ sudo udevadm control --reload-rules
$ sudo shutdown -r now
再起動後、テストプログラムがユーザ権限で実行できることを確かめます。
$ /usr/local/src/libpafe/tests/pasori_test
libpafe-ruby
libpafe-rubyはrbenvなどで環境を分ける場合は使用する環境ごとにインストールする必要があります。
$ git clone https://github.com/rfujita/libpafe-ruby
$ cd libpafe-ruby
$ ruby extconf.rb
$ make && make install
インストールが完了したらテストスクリプトを走らせてみます。
$ ruby sample/suica.rb
かざしたSuicaの情報が取得できれば成功です。
Suicaを読む
ライブラリのサンプルを参考にSuicaを対象に改札の入出場記録や購買記録の読み取りを行うスクリプトを作成しました。
実際に実行すると以下のような結果が得られます。
$ ruby reader.rb --purchase-history
14337 2019-01-17 4434 改札出場 改札機
14849 2019-01-17 4027 改札出場 改札機
15105 2019-01-17 3080 物販 物販端末
15361 2019-01-18 2259 物販 物販端末
15873 2019-01-18 1852 改札出場 連絡改札機
16385 2019-01-18 535 改札出場 改札機
16641 2019-02-23 5535 チャージ 精算機
16897 2019-02-23 4391 改札出場 改札機
17409 2019-02-23 4226 改札出場 改札機
17921 2019-02-24 3082 改札出場 改札機
18177 2019-03-13 6082 チャージ 簡易入金機
18433 2019-03-13 4765 改札出場 連絡改札機
18945 2019-03-13 4358 改札出場 改札機
19457 2019-03-13 4098 改札出場 改札機
19969 2019-03-14 3838 改札出場 改札機
20481 2019-03-14 3578 改札出場 改札機
20737 2019-03-14 2748 物販 物販端末
21249 2019-03-14 2488 改札出場 改札機
21761 2019-03-14 2081 改札出場 連絡改札機
22273 2019-03-14 764 改札出場 改札機
最新20件のレコードが取得できるので、直前の残高との差分を取れば購買記録の出来上がりです。
$ ruby reader.rb --purchase-history | awk 'NR==1{prev=$3} NR>1{print $1,$2,$3-prev; prev=$3}'
14849 2019-01-17 -407 改札出場 改札機
15105 2019-01-17 -947 物販 物販端末
15361 2019-01-18 -821 物販 物販端末
15873 2019-01-18 -407 改札出場 連絡改札機
16385 2019-01-18 -1317 改札出場 改札機
16641 2019-02-23 5000 チャージ 精算機
16897 2019-02-23 -1144 改札出場 改札機
17409 2019-02-23 -165 改札出場 改札機
17921 2019-02-24 -1144 改札出場 改札機
18177 2019-03-13 3000 チャージ 簡易入金機
18433 2019-03-13 -1317 改札出場 連絡改札機
18945 2019-03-13 -407 改札出場 改札機
19457 2019-03-13 -260 改札出場 改札機
19969 2019-03-14 -260 改札出場 改札機
20481 2019-03-14 -260 改札出場 改札機
20737 2019-03-14 -830 物販 物販端末
21249 2019-03-14 -260 改札出場 改札機
21761 2019-03-14 -407 改札出場 連絡改札機
22273 2019-03-14 -1317 改札出場 改札機
購買記録には取引通番として一意な番号が振られているので、読み取り結果をuniqして蓄積すれば実質家計簿としても使えそうです。
改札の入出場記録ですが、直近3件しか記録されていないようでちょっとおもしろい使い方が思いつきませんでした。(出かけた時刻と帰宅した時刻のログを取り続けたら生活習慣の可視化とかできるかな~と思ったんですが出発時の入場記録があぶれちゃって残らないですね……。)