ども、お天気お兄さんの 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 延長ケーブルを使って以下のようにつなぎました。

Raspberry Pi で室温を可視化: ハードウェアの接続(延長ケーブルで離す)

温度計測

以下のように実行して温度計測を行います。

sudo ./temper

以下のように出力されます。

09-Nov-2014 14:39,22.810099

時刻が UTC になっていますが、必要に応じて UTC ではなくて localtime で出力するように修正しましょう。時刻の後にカンマ区切りで続く数値が温度計で感知した温度です。22 度とはちょっと寒いかもしれませんね…。


Sango を介して(MQTT で)結果を Graphite に飛ばす

せっかくなんで

直接 Graphite に温度のデータを飛ばすのも面白くないので MQTTSango に飛ばしてみたいと思います。Sango に届いたメッセージは Graphite ホストで稼働する subscriber がメッセージを取得して解析、Graphite に値を投げます。

Raspberry Pi で室温を可視化: 構成図

処理の流れとしては上図のような感じです。

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 で室温を可視化: Graphiteでグラフ描画

緑色の線が Raspberry Pi 自身の温度、下の青色の線が室温となります。室温を採取しはじめて 2 時間くらいしか経過していないので面白くないかもしれませんが、夜中とかどんな感じで下がるのかなーって楽しみです。


最後に

1000 円くらいの USB 温度計と簡単なスクリプトで室温を可視化することが出来ました。ホント簡単過ぎて笑ってしまいそうです。次回は Amazon Kinesis で温度データをストリーム処理して Dynamo DB に突っ込んでみたいと企んでいます。

うっしっし。

元記事はこちらです。
Raspberry Pi で室内の温度を可視化するよー