Raspberry pi 2で取得したデータをグラフにする(Mathematica編)
さて、前回の記事のなかで、ブレッドボード上に配置した温度センサー(MP9700)と明度センサー(CDS)のデータがとれるようになりました。
以下のようなタブ区切り形式(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ピクセルです。
これでできあがった画像は以下のようになりました。
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でもっと簡単にグラフが描ける仕組みがあるようなら、そちらを使うのが吉かもしれません。
- 作者: Sal Mangano,松田裕幸
- 出版社/メーカー: オライリージャパン
- 発売日: 2011/04/25
- メディア: 大型本
- 購入: 1人 クリック: 19回
- この商品を含むブログ (7件) を見る