obnizとLINE Botを組み合わせて、ビールの飲み頃温度を教えてくれるIoTに挑戦！

##ビールの温度をを教えてくれるLINE Bot
**ビールの温度を教えて！**と入力すると、ビールの温度を教えてくれます。毎度入力するのが面倒なので、リッチメニューを使い、タップ1回で返してくれるようにしました。
<iframe width="500" height="400" src="https://www.youtube.com/embed/5fbTzrUTFkA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


使用風景も載せておきます。
温度を教えてくれるタイミングで、**ビールの温度が4℃以下ならLEDが黒色に光る、4℃以上なら青色に光ります。**
かわいいビールケースが売っていたのでついつい買ってしまいました!
（ちょいおふざけ入れるとテンション上がりますよね笑）
<iframe width="500" height="400" src="https://www.youtube.com/embed/JqduaAYyG3k" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


遡るは1か月前、JavaScriptって何なんだ！？
から始まり、LINE Botを習い、obnizを使ってIoT入門しました。

先日、**最高の状態のビールを飲みたい！**私利私欲のためのIoT製作ということで、
Qiita記事：[obnizでビールの飲み頃温度を教えてくれるIoTを完成させたい！](https://qiita.com/tanakahiroki/items/d3df67fa876856d37c7c)
を投稿させていただきました。

目指すゴールは<font color="blue">**冷蔵庫から出したビールの温度を測りながら、ビールの飲み頃と言われている4℃以上になったら
飲み頃サインをLEDが光って教えてくれるもの**</font>です。

[温度センサ（LM60）](https://obniz.com/ja/sdk/parts/LM60/README.md)を使って試みましたが思うようにはいかず、[Qiita QA](https://qiita.com/tanakahiroki/questions/5816b8f8a55b82a51faf)で質問させていただいたところ、赤外線アレイセンサ[（Thermal Camera Sensor - AMG8833）](https://obniz.com/ja/sdk/parts/AMG8833/README.md)が良いのでは？とアドバイスいただき、買ってみました！

が、配送に時間がかかっているようで、未だ手元に届きません、、、残念！
というわけで、まずは手元になる温度センサ（LM60）とLEDを使って、obnizとLINE Botの連携を試した結果です。

##環境
Visual Studio Code v1.60.2
Node.js v16.10.0
ngrok　2.3.40

##使用したもの
■コントロールボード
　　：obniz Board 1Y
■温度センサ（LM60）
　　：obniz0~2番へ繋ぐ <font color="red">※差し込む方向注意</font>
　　：ジャンパワイヤ（オスメス）で延長する
　　：LM60と缶ビールをアルミホイルで巻き、温度を測る
■フルカラーLED（WS2811）
　　：obniz9~11番へ繋ぐ
　　：ジャンパワイヤ（オスメス）とジャンパワイヤ（オスオス）で延長し、ブレッドボードへ繋ぐ

##コード
<details><summary>コードはこちら**（タップで表示）**</summary><div>

```js
const Obniz = require('obniz');
const obniz = new Obniz('0000-0000');  // Obniz_IDに自分のIDを入れてください

// obnizと接続確立したとき
obniz.onconnect = async () => {
    obniz.display.clear();
    obniz.display.print('obniz Ready');
}
// 温度センサから値を取得して返す
const getObnizTemp = async () => {
    // 温度センサの利用
    const tempsens = obniz.wired('LM60', { gnd: 0, output: 1, vcc: 2 });
    // RGB LEDを利用
    const rgbled = obniz.wired('WS2811', { gnd: 9, vcc: 10, din: 11 });
    // 非同期で取得
    const temp = await tempsens.getWait();

    if (temp > 4) {
        // ブルー
        rgbled.rgb(0, 51, 255);
    } else {
        // ブラック
        rgbled.rgb(0, 0, 0);
    }

    // ターミナル表示
    console.log('obniz temp:', temp);
    // obnizディスプレイ表示
    obniz.display.clear();
    obniz.display.print(temp + ' C');
    // 温度値を返す
    return temp;
}

// ########################################
//          LINEBot イベント処理部分
//  channelSecret：LINE Developers → チャネル基本設定 → チャネルシークレット
//  channelAccessToken：LINE Developers → Messaging API設定 → チャネルアクセストークン（長期）
//  ターミナルで `ngrok http 3000` 実行後、発行されたURLをWebhook URLとして設定するのを忘れずに
//  「検証」ボタンをクリックするとターミナルにエラーが出ますがここでは問題ありません（検証イベントのハンドリングをしていないため）
// ########################################
const config = {
    channelSecret: '作成したBOTのチャネルシークレット',
    channelAccessToken: '作成したBOTのチャネルアクセストークン'    
};
const line = require('@line/bot-sdk');
const client = new line.Client(config);
// ExpressからMessaging APIイベントを渡されて処理するところ
const handleEvent = async (event) => {
    // テキストメッセージ以外を受信したときは何も行わずresolveを返す
    if (event.type !== 'message' || event.message.type !== 'text') {
        return Promise.resolve(null);
    }
    // テキストメッセージを受信したとき
    if (event.message.text === 'ビールの温度を教えて！') {
        // 測定中というメッセージを「リプライ」で先に返す
        client.replyMessage(event.replyToken, {
            type: 'text',
            text: '測定中、、、'
        });
        // obnizの温度センサから値をとってくる（ブロッキング・時間のかかる処理で一旦ここで止まる）
        const temp = await getObnizTemp();
        // tempが取得できたらそれを含めたメッセージを「プッシュ」で送信する
        client.pushMessage(event.source.userId, {
            type: 'text',
            text: 'ビールの温度は' + temp + '度です！',
        });
    } else {
        // メッセージの中身が「温度教えて」以外だったとき
        client.replyMessage(event.replyToken, {
            type: 'text',
            text: 'ビール画像をタップしてね！'
        });
    }
    // resolveを返す
    return Promise.resolve(null);
}

// ########################################
//          Expressサーバー部分
// ########################################
const express = require('express');
const PORT = process.env.PORT || 3000;
const app = express();
// 「(サーバーURL)/webhook」にアクセス（LINEサーバーからのWebhook）があったとき
app.post('/webhook', line.middleware(config), (req, res) => {
    // 受信したイベントをターミナルに表示
    console.log(req.body.events);
    // イベントをhandleEventに渡して1つずつ処理
    Promise.all(
        req.body.events.map(handleEvent)
    ).then(
        result => res.json(result)
    );
});
// PORT番号のポートでサーバーを開始
app.listen(PORT);
console.log('express runnning: PORT =', PORT);
```
</div></details>

:::note warn
基本、コードはこのままコピーすれば使えますが、
　・obniz ID
　・Botのチャネルシークレット
　・Botのチャネルアクセストークン
の変更を忘れずにお願いします。
:::

##職場の人にヒアリング
非接触赤外線温度センサーが届いていないので、完成とは言い難い状況ですが、せっかくかたちになったので職場の人に使いたいか聞いてみました！

5人に聞きてみたところ、面白さは感じてくれているものの、欲しいか聞くと全員の答えは**「え、いる？」**という回答。。。
内心、<font color="gray">こいつらデザイン思考だな！アート思考も大事なんだぜ！</font>と言いたくなりましたが、素直に答えてくれたみんなに感謝！
<font color="gray">もともと自分がビールを美味しく飲むために作るんだからほっとけ！</font>って、自分で聞いておきながら思ってしまったのは内緒です。
とはいえ、やっぱり心強い仲間たち。色々なヒントをくれました。

:::note 
・缶ビールはキンキンに冷やして飲みたいけど、IPAやヴァイツェンのような香り華やかなエールビールは測りながら、その過程の時間も楽しめそう！
・ぬる燗、熱燗（日本酒の温度管理って難しいから）飲むときに欲しい！
・焼酎お湯割りも適温難しいから、あったらいいね！
:::

全部お酒に関する話でした、、、笑
類は友を呼ぶってやつですかね、、、

兎にも角にも、**obnizとLINE Botを組み合わせには成功しました！**
が、センサーが届かず**肝心の温度がちゃんと測れていない**ので、買ったセンサーを待ちながらコード書けるよう勉強続けます！
ちゃんと測れるようになったら、また記事書きたいと思いますので、お楽しみにお待ちくださいませ。

最後まで読んでいただき、ありがとうございました！