Netatmo Weather Station + Hubot + Chatwork で室内環境を通知する仕組みを作った
背景
オフィスで仕事中、夕方ぐらいになると頭がぼぉーっとしたり、空気悪いと感じる事がしばしばありました。なのでオフィスの室温や湿度、その他もろもろ計れる、ついでに業務で利用しているChatworkで通知されるといいなぁと常々思っていました。
そこで調べた所、下記の記事が参考になったのでこれのChatwork版を試してみました。 qiita.com
購入
Netatmo Weather Station
- 公式サイト:https://www.netatmo.com/ja-JP/product/weather-station
- ドキュメント:https://dev.netatmo.com/doc
- 結果画面サンプル:https://my.netatmo.com/app/station?demomode=true
室内・室外の温度や湿度、CO2濃度などを測定でき、その結果はクラウド上に蓄積されます。蓄積された結果はアプリやPC、API経由で確認する事ができる代物です。
お値段はそれなりにするので、購入する際には各者への相談が必須です。
Hubot
Hubot自体やインストール方法についてはググればすぐ分かると思うので割愛します。
私はnpm install yo generator-hubot
で必要なツールをインストールし、yo hubot
でぱぱっとbotを作成しました。
Hubot + Chatwork
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
Netatmo APIを利用するためのパッケージが公式にあるため、これを利用します。
$ npm install netatmo
また、APIを利用するにあたり以下の情報が必要になります。
- client_id
- client_secret
- https://dev.netatmo.com/dev/createapp からアプリケーション作成
- アプリケーション詳細で確認
- 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
上記を行うための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.respond
でbotを特定のワードで呼んだら処理が実行されるようにしています。あとはNetatmoAPI経由で取得した室内環境情報を整形し、Chatworkに通知しています。
試してみる
(dance)
試して思った事
- 頭がぼぉーっとするのはCO2濃度のせいではなく単純に暑かっただけOrz
- 空気がこもる感覚?はさすがに計測できそうにない
- Netatmo Weather Stationには室外用もセットでついてくるけどほぼ使わない、むしろ室内用のみのセットを販売してほしい
- 週間天気なども詳細に計測されているのでそれの通知もあると面白そう
- オフィス導入するにはそれなりのパワーが必要(お値段的に
オフィス環境の改善はデスクやチェア、お菓子などが思いつきますが、こういう環境改善も重要です、健康に関わる事ですし。