日記とか、工作記録とか

自分に書けることを何でも書いてゆきます。作った物、買ったもの、コンピュータ系の話題が多くなるかもしれません。

Raspberry pi 2で取得したデータをグラフにする(Mathematica編)

さて、前回の記事のなかで、ブレッドボード上に配置した温度センサー(MP9700)と明度センサー(CDS)のデータがとれるようになりました。
f:id:WindVoice:20150222095248j:plain
以下のようなタブ区切り形式(TSV)のファイルになっています。

pi@raspberrypi:~/work$ head data.tsv
"2015/03/01 15:53:47"    22.11  177.32
"2015/03/01 15:54:47"    21.97  177.09
"2015/03/01 15:55:47"    21.94  177.68
"2015/03/01 15:56:47"    22.08  179.11
"2015/03/01 15:57:47"    22.04  179.70
"2015/03/01 15:58:47"    22.17  181.13
"2015/03/01 15:59:47"    22.12  185.02
"2015/03/01 16:00:47"    22.15  187.37
"2015/03/01 16:01:48"    22.06  188.14
"2015/03/01 16:02:48"    22.08  186.45
pi@raspberrypi:~/work$

文字列のデータではおもしろみがありませんので、グラフにしたくなりました。このファイルを使ってExcelでグラフにすれば簡単ではありますが、Raspberry pi 2にはせっかくMathematica(wolfram)がインストールされているのですから、これを使ってみたいと思いました。これが悪夢の始まりでしたが……

wolframコマンドのスクリプトでグラフを描く

wolframコマンドは、主に数学的な処理をするための環境です。スクリプトを実行することも可能なのですが、一般的なプログラミング言語とはかなり考え方が異なる作りをしており、全て関数のように記載してゆきます。

まず、書き上がったスクリプトを引用してしまいましょう。

pi@raspberrypi:~/work$ more create_graph.wl

$DateStringFormat := {"Year", "/", "Month", "/", "Day", " ", "Hour", ":", "Minute", ":", "Second"}
rawdata = Import["/home/pi/work/data.tsv", "Table"]
rawdata2 = MapAt[DateList, #, 1] & /@ rawdata
tempdata = { rawdata2 /.{i_, j_, k_} :> {i,j} }

Export[
  "/home/pi/httphome/temp.gif",
  DateListPlot[
    tempdata,
    DateTicksFormat -> {"MonthShort", "/", "Day"},
    GridLines -> {None, {12, 16, 20, 24}}
  ],
  ImageSize -> { 1400, 800 }
]

ざっくりした説明で申し訳ないですが……

  • Import[]は、TSV形式のデータファイルを、内部が表(Table)形式ですよ、という情報を与えて読み込んでいます。読み込んだ結果にrawdataという名前をつけます。
  • rawdataのひとつひとつについて(MapAt)、文字列形式の日付をwolframが扱いやすい日付形式に変換(DateList)しています。この結果をrawdata2とします。
  • 今回は気温のデータだけをグラフにしたいので、明るさについてのデータは破棄しています。3個1組のデータ(日時、気温、明度)を、2個1組のデータに変換して、これをtempdataと呼ぶことにします。
  • できたデータをファイル名temp.gifという画像に出力(Export)します。画像は日時に関するグラフ(DateListPlot)にします。日時の軸方向には(月/日)の形式のラベルをつけます。あと、12℃から4℃置きに線を引いてグラフを見やすくします。画像のサイズは1400ピクセル x 800ピクセルです。

これでできあがった画像は以下のようになりました。

f:id:WindVoice:20150307193102g:plain

crontabに登録して画像が自動更新されるようにする

グラフ画像作成が一時間に一度行われるように、Raspberry pi 2のcrontabに登録します。crontabの20行目が該当の記載です。

pi@raspberrypi:~/work$ EDITOR=vi crontab -e
  1 # Edit this file to introduce tasks to be run by cron.
  2 #
  3 # Each task to run has to be defined through a single line indicating with different fields when the task
  4 # will be run and what command to run for the task
  5 #
  6 # To define the time you can provide concrete values for minute (m), hour (h), day of month (dom), month
  7 # (mon), and day of week (dow) or use '*' in these fields (for 'any').# Notice that tasks will be started
  8 # based on the cron's system daemon's notion of time and timezones.
  9 #
 10 # Output of the crontab jobs (including errors) is sent through email to the user the crontab file belongs to
 11 # (unless redirected).
 12 #
 13 # For example, you can run a backup of all your user accounts at 5 a.m every week with: 0 5 * * 1 tar -zcf
 14 # /var/backups/home.tgz /home/
 15 #
 16 # For more information see the manual pages of crontab(5) and cron(8)
 17 #
 18 # m h dom mon dow command
 19
 20 0 * * * * sudo wolfram -script /home/pi/work/create_graph.wl > /dev/null

あとはこれをApacheなりmini-httpdなりのホームディレクトリに置いておけば、いつでもブラウザから自宅の気温の推移が確認できるようになります。仕組みは簡単と言えば簡単なのですが、wolframがとにかく使いづらく、試行錯誤の結果どうにか動くようになりました。Pythonでもっと簡単にグラフが描ける仕組みがあるようなら、そちらを使うのが吉かもしれません。

Mathematicaクックブック

Mathematicaクックブック