【Watson】Slackからオフィスのエアコンをnature Remoで操作できるようにした話し【AWS lambda】

オフィス内のエアコンをSlackから操作できるようにしてみました。
実装内容はサーバレスとしてAWS lambdaを利用し、自然言語処理としてWatsonを使ってみました。
赤外線リモコンとしてRemoを利用。なにかの参考になれば^^

<img width="440" alt="図１.png" src="https://qiita-image-store.s3.amazonaws.com/0/41761/c1376284-ca4b-4f6f-dd6c-92518f56b6bd.png">

# 実装するきっかけ
* オフィス内で多かった空調についての不満
    * 場所によってちょうどよい温度にならない
    * 人によって暑い寒いの基準がバラバラ
    * 夏は寒くて・冬は暑い
* その他、よくある問題
    * 複数台のエアコンを付けたり消して帰るの面倒くさい
    * エアコン消すの忘れた

#### それってスマホアプリやスマートスピーカーでもできるんじゃ？

* もちろんできるがスマートスピーカーはオフィスだと恥ずかしいし、スマホはみんなが設定する必要がある


#### リモコンでいいんじゃ？

* じつは会議室と執務室はエアコンが連動しており、同じリモコンで操作するため、会議室からエアコンを操作しようと思うと部屋を出ないといけなく会議室の人はみな我慢していました。

__そこで！Slackからエアコンを操作できるようにしてみました。__

# Slackを使う利点
* Slackは全員が使っている
    * 説明の必要がない
* 可視化ができる

# 実装内容
* Slack Event API -> AWS API Gateway -> lambda -> lambda -> Watson -> Dynamo -> Remo API -> Slack  
<img width="470" alt="図２.png" src="https://qiita-image-store.s3.amazonaws.com/0/41761/e54bd49f-7b05-be7e-a7e2-640b1db5f8f2.png">


# できるようにしたこと
* エアコン操作
    * 各センサー（Remo）から、温度、湿度、光度の取得
    * 各エアコンの設定を記憶・取得（設定温度、暖房・冷房、風量）
    * 温度を絶対指定
    * 温度を相対指定
    * 風量変更
    * 冷暖房の切り替え
* 会議室のテレビ操作
    * テレビのオン・オフ
    * 音量の変更
* 天気の取得

# Slackでの特徴
* 専用のチャンネルを作った
    * Botにメンションも考えたけど、メンションするのが面倒かなと思って実験

# 実装してみてよかった点
* リモコン操作の可視化がされる
    * 誰が暑い・寒いと思っているのかがわかる。
* 場所の温度・湿度がわかる
    * だいたい25度を超えると暑く感じ２４度を下回ると寒いらしい
    * ２４．５度くらいが適温っぽい
* 複数台の設定を考えて設定できる
    * エアコン各々で設定していたことが、Aさんが寒いといっているのでAさんから遠いエアコン１を強、Aさんに近いエアコン２を弱という設定が可能
* 一番はじめに出社する人が会社に付く前にONにできてオフィスに着いたらすでに快適！
* 帰る時にエアコンを消して回らなくてよい

__うまく操作できている場合__ 
![成功.png](https://qiita-image-store.s3.amazonaws.com/0/41761/cd20aa29-c78c-62b2-84b1-da3b601291f7.png)

__暑いと思っている人と、寒いと思っている人。温度を調べると場所で温度差が結構ある__
![攻防.png](https://qiita-image-store.s3.amazonaws.com/0/41761/d61dab38-5718-2b2b-acee-d98794e1e8b8.png)




# 実装面で困ったこと
* lambdaでWatsonからのレスポンスなど長い場合にJsonが途中で切れて返ってくる
    * 知らなかっただけかもしれませんが、結合処理が必要。。。ここで結構困った。
* Slackからlambdaへメッセージを送った場合、レスポンスを３秒以内に返さないと、メッセージが最大３回繰り返される。
    * lambdaからlambdaを呼ぶ形で実装。ここも原因がわからず結構困った。SlackもLambdaもエラーなどがあるとリトライするらしい。
* エアコンのリモコンの命令が温度、風量、冷暖房と全て一括送信するため、学習させるのが台数分とても手間だった。
* 学習させたリモコン情報が正しく学習できていない時があり再度登録するのに手間がかかった。
    * おそらく学習させるときに適当な角度でやっていたのが問題

# 開発の感想
* Watsonを自然言語処理の判断で利用したが、もし使っていなかったら定形文言でしか処理ができなくなりそうなくらい、かなり複雑でそこの処理を任せられたのはよかった。
* Remo apiは便利。IoT機器でAPIが開放されているものがあれば色々できそう。
* Remoには光センサーがあるため、会議室など電気がついていないとセンサーの値が低くなるため会議室を使っているかどうかがわかるようになりました。

__例）5階会議室の光量が低いので部屋が使われていない__
![スクリーンショット 2018-09-19 19.52.08.png](https://qiita-image-store.s3.amazonaws.com/0/41761/5e2fa44d-6642-9b48-f2da-d8750c067550.png)


# 運用して困ったこと
* 思った以上にみんなが打つ文言が異なる
    * 温度が相対指定だったり、絶対指定
    * 寒い、すごく暑い、話し言葉
    * とりあえずがんばって登録、改善。
        * 学習仕組みがあるとよさそう。
        * ここの改善を繰り返ししたことで、かなり快適に動いているように思う。
        * 認識を間違えた場合、Watsonで例文を登録するだけで正しく認識するようになるので修正がとても簡単だった
* 専用チャンネルにしたため、みんながそのチャンネルで話し出すと全てを拾って何かしらの操作を勝手に行ってしまった。
    * スレッドに反応しないように変更して、会話したい場合はスレッド形式で行ってもらうようにした。
* リモコンとSlackからの設定が異なってしまう。
    * どっちでやっているかがわからない
    * Slackで設定して上書きして対応する


__Watsonへの学習が足りなかった場合__
![失敗.png](https://qiita-image-store.s3.amazonaws.com/0/41761/6e9822d7-cbbe-679b-bb78-c2c5d5a84904.png)

# 運用の感想
* 作っている最中に誰も使ってくれないのではないかととても心配でしたが、エアコンの設定が可視化されリモコンを操作しなくてもよくなったのでみんな作ってくれてとても嬉しかったです。
暑い、寒いという人や、温度を相対指定する人、絶対指定する人など色々おられて面白いです。
* 会議室のテレビ操作はおまけで作っていたのですが、便利とのことでリモコンを使わず操作してもらっているのも個人的には意外な点でした。


スマートスピーカーにしろチャットUIにしろ今後色々できるようになってくると実感しました。
SlackだけでなくLineでも同様のことは作れるのでアイデア次第で色々できそうな点が面白かったです。