e-DIY
IoT 家電

エアコンを操作するLINE botの作り方〜GASを使ってbotを作ろう〜

LINEbotを作ってエアコンを操作させる

この前の記事ではWiFi経由でエアコンをスマホからオン・オフ制御していましたが、妻から外出先からオンできるようにしてほしいと要望がありました。
そりゃそうだよなと思ってポート解放しようと思ったのですが、セキュリティ面で心配なのでLINEbotを使って制御するようにしたいと思います。
追記VPN構築したので外からでもアクセスできるようになりました

ESPからエアコンのリモコンの制御はこちらのものを流用します。

完成のイメージはこんな感じ。

LINEからエアコン制御

この記事では、

  • LINE Messaging APIの設定
  • Google Apps Script (GAS)の設定
  • LINEリッチメニューの作成

までをやっていきたいと思います。

LINE Messaging APIとは

LINE Messaging APIは、LINEのメッセージを送受信するためのAPIです。
これを使って、ユーザーとのやり取りを自動化するボットを作成することができます。

この機能を使って次のようなことをやりたいと思います。

  1. LINEから「エアコンオン」または「エアコンオフ」のメッセージを送る
  2. LINE Messaging APIでボット(GAS)にメッセージの内容を送信
  3. ボットがメッセージの内容を判別してESP8266に指示を送信する
  4. ボットがメッセージの内容に応じた返信をLINEに送る(「エアコンをオンしました」など)

3に関しては、実際には間にBeebotteというサービスを挟みますが、それについては次の記事で解説したいと思います。

LINE Messaging APIの設定

まずはLINE Developersへログインします。

プロダクトからMessaging APIを選択します。

LINE Messaging API

次に必要事項を入力していきます。

linebotの設定

プロバイダーはアカウントを管理するための組織やグループのようなもので、その下に複数のチャネルが紐付きます。

linebotの設定

チャネルアイコンの登録は任意になっていますが、LINEに表示されるアイコンなので登録しておきましょう。
チャネル名もLINEに表示される名前なので、分かりやすい名称にしておきましょう。

これで登録が完了です。

LINEbotを作る

次に、LINEからのメッセージを受け取るボットをGoogle Apps Script (GAS)を使って作っていきます。

Google Driveから、左上の「新規」→「その他」→「Google Apps Script」と進みます。

GAS

エディターが開くので下記のコードを入力します。

//LINEからのPOSTを処理する関数
function doPost(e) {
  //LINEから受け取ったデータをパースし、replyTokenを取り出す
  var replyToken= JSON.parse(e.postData.contents).events[0].replyToken;
  //replyTokenが存在しない場合は処理を終了
  if (typeof replyToken === 'undefined') {
    return;
  }
  //LINE Messaging APIのエンドポイント
  var url = 'https://api.line.me/v2/bot/message/reply';
  //認証に使用するチャネルトークンを入力
  var channelToken = 'あなたのチャネルトークン;

  //LINEから受け取ったデータをパースし、メッセージテキストを取り出す
  var receive_message = JSON.parse(e.postData.contents).events[0].message.text;
  //応答するメッセージのデフォルトのテキストを設定
  var reply_text = receive_message + "\n" + "は無効なメッセージです";

  //ONというメッセージを受け取った場合は「エアコンをつけます」というメッセージをLINEに返す
  if(receive_message == "ON") {
    beebottePub("ac_on"); //Beebotte用設定
    reply_text = "エアコンをつけます";

  //OFFというメッセージを受け取った場合は「エアコンを消します」というメッセージをLINEに返す
  } else if(receive_message == "OFF") {
    beebottePub("ac_off"); //Beebotte用設定
    reply_text = "エアコンを消します";
  }
  
  //LINEに対して応答メッセージを返すためのAPIコールを行う
  UrlFetchApp.fetch(url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + channelToken,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': replyToken,
      'messages': [{
        'type': 'text',
        'text': reply_text,
      }],
    }),
  });
  //処理が成功したことを示すレスポンスを返します。
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

//以下はBeebotteの設定のため、解説は次の記事で
function beebottePub(action) {
  var headers = {
    "Content-Type": "application/json",
    "X-Auth-Token": "トークンを入力"
  };
  var json = `{"data":"${action}"}`;
  var options = {
    "headers": headers,
    "method": "post",
    "payload": json
  };
  UrlFetchApp.fetch("https://api.beebotte.com/v1/data/publish/チャネル名/リソース名", options);
}

スクリプトを保存したら、右上のデプロイボタンを押し、「新しいデプロイ」を選択。
必要事項を入力してデプロイボタンを押します。

アクセスの承認を求められるのでそのまま進めます。
この辺りの詳細は下記記事にまとめているので参考にしてください。

チャネルアクセストークンを確認

LINE Messaging APIを使ってアクセスするためには、トークンでの認証が必要です。
LINE Developersに戻って、Messaging API設定の一番下にチャネルアクセストークンがあるのでコピーします。
そして、先ほどのGASのコードの12行目に貼り付けます。

チャネルアクセストークン

LINEのリッチメニューを作成する方法

エアコンのスイッチを送るのに、毎回「ON」、「OFF」とLINEのメッセージに打つ必要があります。
これはちょっと面倒なので、リッチメニューでONとOFFのボタンを作って、タップするだけでGASにメッセージを送れるようにしたいと思います。

まず、LINE for Businessにログインします。

ホーム→リッチメニュー→作成と進みます。

LINEリッチメニューの作成方法

今回はオンとオフの2つのボタンがあればいいので、2つの領域に分かれているテンプレートを選択しました。

LINEリッチメニューの作り方

アクションの部分には、GASで設定したメッセージを設定します。
つまりONとOFFです。

LINEリッチメニューの作成方法

これで、左の領域をタップすると「ON」がGASに送られ、右の領域をタップすると「OFF」が送られます。

動作確認

LINE DevelopersのMessaging API設定に表示されているQRコードを読み込んで、作成したボットをお友達登録しましょう。

登録したら、リッチメニューをタップしてみましょう。
このように表示されれば成功です。

LINEbot

次の記事ではGASからMQTTを介してESP8266のGPIOを制御して、エアコンのスイッチのオン・オフを切り替えたいと思います。

関連キーワード

フリーワード検索