カイワレスタイル

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

室内の湿度を監視して加湿を促すシステムを作った

この記事は、Raspberry Pi Advent Callender 2015の23日目の記事です。
22日目はCS_Tokuさんの「Raspberry PiとRGBマトリクスで電光掲示板作ってアニメ流したった」でした。

qiita.com

自分もLEDが好きなので、そのうちLEDマトリックスで色々遊んでみたいと思います。

Raspberry Pi + slack + hubot + 温湿度センサ

以前、Raspberry Piとslackとhubotと温湿度センサで室内の温湿度を測定してslackに投稿する仕組みを作ったが、それを更に改良した。
構築方法に付いては過去記事を参照。

kaiware007.hatenablog.jp

湿度監視システム

せっかく室内の温湿度が測定出来るようになったので、定期的に湿度を測定して快適な湿度をはみ出してしまったら通知するように改良した。
ちなみに快適な湿度とは、45%〜65%の間らしい。*1
さらに、室内灯にPhilips Hueを使っているので、湿度に応じて灯りの色を変えて目でもわかるようにしてみた。

ざっくりとした仕組みは下記の通り

  1. node-cronで毎時間温湿度を測定しslackに投稿する
  2. 湿度が45%を下回っていたら「湿度低すぎ」と判断し、加湿を促すメッセージをslackに投稿し、Philips Hueを赤くする
  3. 湿度が65%を上回っていたら「湿度高すぎ」と判断し、除湿を促すメッセージをslackに投稿し、Philips Hueを青くする

Philips HueをRaspberry Piから制御する方法は過去記事を参照。

kaiware007.hatenablog.jp

一定時間毎に温湿度を監視して通知するスクリプト

hubotは(というかnode.jsは)受動的に処理を行うのは得意だが能動的に処理を行うのは苦手。
定期的に処理をするために、node-cron をインストールする。

$ npm install cron

続いて、温湿度を監視するCoffeeScriptを作成。
湿度を監視するジョブの起動と停止は、slackからできるようにしている。

# Description:
#   温湿度を監視する
#
# Commands:
# hubot 湿度監視して 湿度監視をする
# hubot 湿度監視やめて 湿度監視をやめる

uc = require('../libs/usercheck') # 特定のユーザーかどうかチェックする自作ライブラリ
tmp = require('../libs/temperature')
hue = require('../libs/hue')
CronJob = require("cron").CronJob

STORE_KEY = 'hue_hudi_key'

request = require('request')
exec = require('child_process').exec
envelope = room: "#general"

module.exports = (robot) ->
    
    # 温湿度をチェックする関数
    tempCheck = () =>
        tmp.get_temperature((err, temp, hudi) ->
            if !err
                robot.send envelope, "現在の室温は#{temp}℃、湿度は#{hudi}%です"
                if hudi < 45
                    hue.set_hue_color(128, 255, 6375)   # Hueを赤くする
                    robot.send envelope, "室内が乾燥し過ぎのようです。加湿したほうがよろしいかと思います"
                else if hudi > 65
                    hue.set_hue_color(128, 255, 47000)  # Hueを青くする
                    robot.send envelope, "室内の湿度が高すぎるようです。除湿したほうがよろしいかと思います"
            else
                robot.send envelope, "#{err}"
        )

    # 湿度をチェックする命令
    robot.respond /湿度チェック/i, (msg) ->
        if uc.user_check(msg.message.user.id)
            tempCheck()
        else
            msg.reply 'ご主人様以外のお方からのご命令はお受けできません'

    # 1時間毎に温湿度をチェックするCronジョブ(午前2時〜9時までは計測しない)
    tempJob = new CronJob('0 0 0-1,9-23 * * *', tempCheck)

    # redis.brainの読み込み時に監視設定を読み込む
    robot.brain.on 'loaded', =>
        flag = (robot.brain.get STORE_KEY ) or "false"
        if flag == "true"
            robot.send envelope, "湿度の監視を開始します"
            tempJob.start()

    # 湿度監視開始リクエスト
    robot.respond /湿度監視して/i, (msg) ->
        robot.brain.set STORE_KEY, "true"

    # 湿度監視停止リクエスト
    robot.respond /湿度監視やめて/i, (msg) ->
        msg.send "湿度の監視を停止しました"
        tempJob.stop()
        robot.brain.set STORE_KEY, "false"

実際に使用してみて

自宅湿度監視システムのおかげで、室内が乾燥しているのが目でもわかるようになったのはいいが、加湿器が無いのでどうすることも出来ないという致命的な欠陥が発覚した。
加湿器を購入して、それをRaspberry Piから制御できるようにするといいかもしれない。
「オレはようやくのぼりはじめたばかりだからな このはてしなく遠いおうちハック坂をよ…」
カイワレ先生の次回作にご期待ください。

明日は、kinpiraさんです。