ども、お天気お兄さんの cloudpack の かっぱ(@inokara)です。
はじめに
よくありがちですが…USB タイプの温度計を入手したので Raspberry Pi につないで室内の温度を可視化してみました。
USB タイプの温度計
これ
こちらの「Raspberry Piと980円USB温度センサーで北海道の冬をロギングしてみる徒労日記」の記事を参考にさせて頂いて以下を入手しました。
パッケージは怪しい感じで 8cm の CD-ROM がなんかついてましたが捨てました。
準備
上記の記事 を参考にさせて頂いて温度を計測するツールを用意します。
温度を計測するには、こちらの bitplane/temper のツールを利用しますので git clone しておきます。
git clone git://github.com/bitplane/temper.git
尚、自前で make するにあたって事前に libusb-dev をインストールしておく必要があります。
sudo apt-get install libusb-dev
そしてビルドします。
cd temper make
正常に temper のビルドが終わったら、カレントディレクトリに temper という実行ファイルが生成されます。
設置
Raspberry Pi の USB ポートに接続すると温度計でも Raspberry Pi と同じくらいの温度になってしまいましたが、USB 延長ケーブルを使って以下のようにつなぎました。
温度計測
以下のように実行して温度計測を行います。
sudo ./temper
以下のように出力されます。
09-Nov-2014 14:39,22.810099
時刻が UTC になっていますが、必要に応じて UTC ではなくて localtime で出力するように修正しましょう。時刻の後にカンマ区切りで続く数値が温度計で感知した温度です。22 度とはちょっと寒いかもしれませんね…。
Sango を介して(MQTT で)結果を Graphite に飛ばす
せっかくなんで
直接 Graphite に温度のデータを飛ばすのも面白くないので MQTT で Sango に飛ばしてみたいと思います。Sango に届いたメッセージは Graphite ホストで稼働する subscriber がメッセージを取得して解析、Graphite に値を投げます。
処理の流れとしては上図のような感じです。
Raspberry Pi 側
以下のようなスクリプトを cron で動かしておきます。
#!/usr/bin/env ruby require 'mqtt' require 'json' def config { :host => 'xxx.xxxx.shiguredo.jp', :port => 1883 } end def mqtt_conn MQTT::Client.connect(:remote_host => config[:host], :remote_port => config[:port],:username => 'xxxxxxxxx@github', :password => 'xxxxxxxxxxxxxxxxxx') end t = `cat /sys/class/thermal/thermal_zone0/temp` t = t.to_f.quo(1000) rt = `sudo ~/git/temper/temper | awk -F"," '{print $2}'` rt = rt.to_f json = {type: "temperature", raspi: t, room: rt }.to_json mqtt_conn.publish("xxxxxxxxx@github/test/raspi", json , retain=false) puts json
Graphite ホスト側
以下のようなスクリプトをバックエンドプロセスで起動しておきます。
#!/usr/bin/env ruby require 'mqtt' require 'json' require 'graphite-api' def config { :host => 'xxx.xxxx.shiguredo.jp', :port => 1883 } end def mqtt_conn MQTT::Client.connect(:remote_host => config[:host], :remote_port => config[:port],:username => 'xxxxxxxxx@github', :password => 'xxxxxxxxxxxxxxxxxx') end def graphite GraphiteAPI.new(graphite: "xxx.xxx.xxx.xxx:2003") end mqtt_conn.get("xxxxxxx@github/#") do |topic,message| record = JSON.load(message) graphite.metrics "mqtt.raspberrypi.temp" => record['raspi'] graphite.metrics "mqtt.raspberrypi.room" => record['room'] end
しばらくすると…
下図の右側のように Graphite でグラフが描画されました。
緑色の線が Raspberry Pi 自身の温度、下の青色の線が室温となります。室温を採取しはじめて 2 時間くらいしか経過していないので面白くないかもしれませんが、夜中とかどんな感じで下がるのかなーって楽しみです。
最後に
1000 円くらいの USB 温度計と簡単なスクリプトで室温を可視化することが出来ました。ホント簡単過ぎて笑ってしまいそうです。次回は Amazon Kinesis で温度データをストリーム処理して Dynamo DB に突っ込んでみたいと企んでいます。
うっしっし。
元記事はこちらです。
「Raspberry Pi で室内の温度を可視化するよー」