初めてのシステムと日記

システムも日記も初めてです。

Netatmo Weather Station + Hubot + Chatwork で室内環境を通知する仕組みを作った

背景

オフィスで仕事中、夕方ぐらいになると頭がぼぉーっとしたり、空気悪いと感じる事がしばしばありました。なのでオフィスの室温や湿度、その他もろもろ計れる、ついでに業務で利用しているChatworkで通知されるといいなぁと常々思っていました。

そこで調べた所、下記の記事が参考になったのでこれのChatwork版を試してみました。 qiita.com

 

購入

Netatmo Weather Station

室内・室外の温度や湿度、CO2濃度などを測定でき、その結果はクラウド上に蓄積されます。蓄積された結果はアプリやPC、API経由で確認する事ができる代物です。

お値段はそれなりにするので、購入する際には各者への相談が必須です。

 

Hubot

Hubot自体やインストール方法についてはググればすぐ分かると思うので割愛します。

私はnpm install yo generator-hubotで必要なツールをインストールし、yo hubotでぱぱっとbotを作成しました。

 

Hubot + Chatwork

github.com

hubot-chatworkというアダプターがすでにあるのでこれをインストールします。

$ cd /projects/to/hubot
$ npm i hubot-chatwork --save

Chatwork APIを叩く事になるため、環境変数にChatworkのAPI情報を記述します。

私はなるべく環境変数は1ファイルで管理したかったため、bin/hubotに記述しました。

#!/bin/sh

set -e

npm install
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"

// この3行を追記
export HUBOT_CHATWORK_TOKEN=xxxxxx // APIアクセストークン
export HUBOT_CHATWORK_ROOMS=xxxxxx // 通知先ルームID
export HUBOT_CHATWORK_API_RATE=800 // 1時間当たりのAPIリクエスト数

exec node_modules/.bin/hubot --name "bot" "$@"

HUBOT_CHATWORK_API_RATEに関しては、Chatwork APIに5分あたり100回までのリクエストの制限があるため、1200以下の数値にするのが妥当なようです。

あとはbot名を指定してコマンドを実行すればOKです。

$ bin/hubot -a chatwork -n bot

 

Netatmo

www.npmjs.com

Netatmo APIを利用するためのパッケージが公式にあるため、これを利用します。

$ npm install netatmo

また、APIを利用するにあたり以下の情報が必要になります。

  • client_id
  • client_secret
  • username
  • password
    • Netatmoのアカウント情報
  • device_id

device_idはアプリケーションから確認が出来なかったため、直接APIを叩いて確認しました。

var netatmo = require('netatmo');
 
var auth = {
  "client_id":     "xxxxxx",
  "client_secret": "xxxxxx",
  "username":      "xxxxx",
  "password":      "xxxxx",
};

var api = new netatmo(auth);
api.getDevicelist(function(err, devices, modules) {
  console.log(devices);
});

レスポンス内の_idがdevice_idになります。

 

Hubot + Netatmo + Chatwork

  • Chatworkの特定のワードをトリガーにして処理を行うHubotスクリプトを作成・実行
  • Netatmo APIから室内環境情報を取得
  • 取得した情報をChatworkに通知

上記を行うためのHubotのスクリプトが以下になります。

曜日の日本語表記をしたかったためmomentを利用してます、これも必要であればnpmでインストールしてください。

https://github.com/bossato/hubot/blob/master/scripts/netatmo.coffee

Netatmo = require('netatmo')
moment  = require('moment')

config =
  client_id:     process.env.NETATMO_CILIENT_ID
  client_secret: process.env.NETATMO_CILIENT_SECRET
  username:      process.env.NETATMO_USERNAME
  password:      process.env.NETATMO_PASSWORD

types = [
  "Temperature"
  "CO2"
  "Humidity"
  "Pressure"
  "Noise"
]

options =
  device_id: process.env.NETATMO_DEVICE_ID
  scale:     "max"
  date_end:  "last"
  type:      types

moment.lang 'ja', {
  weekdays:      ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"],
  weekdaysShort: ["日", "月", "火", "水", "木", "金", "土"]
}

module.exports = (robot) ->
  netatmo_api = undefined

  robot.respond /(CO2|二酸化炭素|空気悪い|換気)/i, (msg) ->
    unless netatmo_api
      netatmo_api = new Netatmo config

    netatmo_api.getMeasure options, (err, measure) ->
      response    = measure[0]['value'][0]
      temperature = response[0]
      co2         = response[1]
      humidity    = response[2]
      pressure    = response[3]
      noise       = response[4]

      measure_time   = moment.unix(measure[0]['beg_time']).format("YYYY年MM月DD日(ddd) HH:mm:ss ")
      message = "#{measure_time}に測定した室内環境(dance)\n"
      message += "[info]"
      message += "温度:#{temperature}度\n"
      message += "湿度:#{humidity}%\n"
      message += "CO2:#{co2}ppm\n"
      message += "気圧:#{pressure}hPa\n"
      message += "騒音:#{noise}dB\n"
      message += "[/info]"
      if co2 > 1000
        message += "\n空気が悪いので換気しましょう!オフィスのCO2濃度は1000ppmが目安です!"

      return msg.send message

process.envでは設定した環境変数を呼ぶ事が可能です。ここではbin/hubotでNetatmoAPIに必要な情報を追記したのでそれを呼び出しています。

robot.respondbotを特定のワードで呼んだら処理が実行されるようにしています。あとはNetatmoAPI経由で取得した室内環境情報を整形し、Chatworkに通知しています。

試してみる

f:id:boss_sato:20160201113820p:plain

(dance)

 

試して思った事

  • 頭がぼぉーっとするのはCO2濃度のせいではなく単純に暑かっただけOrz
  • 空気がこもる感覚?はさすがに計測できそうにない
  • Netatmo Weather Stationには室外用もセットでついてくるけどほぼ使わない、むしろ室内用のみのセットを販売してほしい
  • 週間天気なども詳細に計測されているのでそれの通知もあると面白そう
  • オフィス導入するにはそれなりのパワーが必要(お値段的に

オフィス環境の改善はデスクやチェア、お菓子などが思いつきますが、こういう環境改善も重要です、健康に関わる事ですし。