カイワレスタイル

ゲーム、アニメ、プログラム、興味のあることをツラツラと。

Raspberry Pi 2で温度と湿度を測定してslackに投稿する

常時稼働させてhubot+slack連携で色々遊ぶため、2台目のRaspberry Pi 2を購入した。
今回は、温度+湿度センサをRaspberry Pi 2に繋いで、slack経由でhubotに家の室温や湿度を測定させるようにしてみた。


用意したもの


温湿度センサーモジュール

温湿度センサーモジュールはI2CでRaspberry Pi 2と通信できる。
以下のようにRaspberry Pi 2と接続した。

f:id:kaiware007:20150903013604p:plain


回路図

以前作った赤外線リモコン用の回路に追加する形で温湿度センサーモジュールを配置した。

f:id:kaiware007:20150903011338p:plain


スクリプト作成

python版wiringpi2

今回は気まぐれにpythonで温度を取得してみようと思ったら、python用のwiringpiをインストールしていなかったのでインストール。

$ sudo apt-get install python-dev python-pip
$ sudo pip install wiringpi2

温湿度取得用pythonスクリプト作成

以下のスクリプトを作成。
hubotと連携しやすいように、出力をjsonにしている。

import wiringpi2
import os
import struct
import json
from time import sleep

wiringpi2.wiringPiSetup()
i2c = wiringpi2.I2C()
dev = i2c.setup(0x40)
i2c.writeReg16(dev, 0x02, 0x10) # Temp + Hidi 32-bit transfer mode, LSB-MSB inverted why?
i2c.writeReg8(dev, 0x00, 0x00) # Start conversion
sleep((6350.0 + 6500.0 + 500.0)/1000000.0) # Wait for conversion

#LSB-MSB inverted, again...
temp = ((struct.unpack('4B', os.read(dev, 4)))[0] << 8 | (struct.unpack('4B', os.read(dev, 4)))[1])
hudi = ((struct.unpack('4B', os.read(dev, 4)))[2] << 8 | (struct.unpack('4B', os.read(dev, 4)))[3])
os.close(dev) # Don't leave the door open.

dict = {}
dict["Humidity"] = "%.2f" % ((hudi / 65535.0) * 100)
dict["Temperature"] = "%.2f" % ((temp / 65535.0) * 165 - 40)
enc = json.dumps(dict)
print enc

hubot側の呼び出しcoffeescript

作成したpythonスクリプトを呼び出すhubot用のcoffeescriptを作成する。
wiringpiを使うスクリプトを実行するときに管理者権限で実行しないといけないのが気持ち悪い。

# Description:
#   温度と湿度を調べる

child_process = require 'child_process'

user_id_list = [ 'ユーザーID' ]

get_temperature = (msg) ->
  if msg.message.user.id in user_id_list
    child_process.exec "sudo python /home/pi/hdc1000/hdc1000_read.py", (error, stdout, stderr) ->
      if !error
        try
          dict = JSON.parse(stdout)
          temp = dict["Temperature"]
          hudi = dict["Humidity"]
          msg.reply "ただいまの室温は#{temp}℃、湿度は#{hudi}%です"
        catch e
          msg.reply "#{e}"
      else
        msg.reply "#{error}"

module.exports = (robot) ->
  robot.respond /温度/i, (msg) ->
    get_temperature(msg)

動作確認

早速hubotを実行して動作確認してみる。

bin/hubot -a slack

f:id:kaiware007:20150903015857p:plain

動かしてから気づいたが、我が家には温度計も湿度計も無いので正しい値なのかわからない…。
温度に関しては、エアコンの設定温度に近いので恐らく問題ない(適当)

しばらく稼働させて色々機能を追加しながら遊んでいきたい。


備考

温湿度センサーモジュールと一緒に買った、ラバー製光拡散キャップを赤外線LEDに被せてみたがエアコンが全然反応しなかったのでボツにした…。


参考資料

qiita.com

d.hatena.ne.jp