Raspberry Pi 2で温度と湿度を測定してslackに投稿する
常時稼働させてhubot+slack連携で色々遊ぶため、2台目のRaspberry Pi 2を購入した。
今回は、温度+湿度センサをRaspberry Pi 2に繋いで、slack経由でhubotに家の室温や湿度を測定させるようにしてみた。
用意したもの
- Raspberry Pi 2
- HDC1000使用 温湿度センサーモジュール
温湿度センサーモジュール
温湿度センサーモジュールはI2CでRaspberry Pi 2と通信できる。
以下のようにRaspberry Pi 2と接続した。
回路図
以前作った赤外線リモコン用の回路に追加する形で温湿度センサーモジュールを配置した。
スクリプト作成
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
動かしてから気づいたが、我が家には温度計も湿度計も無いので正しい値なのかわからない…。
温度に関しては、エアコンの設定温度に近いので恐らく問題ない(適当)
しばらく稼働させて色々機能を追加しながら遊んでいきたい。
備考
温湿度センサーモジュールと一緒に買った、ラバー製光拡散キャップを赤外線LEDに被せてみたがエアコンが全然反応しなかったのでボツにした…。