LoginSignup
1

More than 1 year has passed since last update.

Slackの特定のチャンネルを監視して、IoT ブロック MESH LEDを光らせる

Last updated at Posted at 2021-04-28

目的

スマフォの通知ではダメなの?

はい、だめなのです!
私のスマフォは常時マナーモードで単純に気づかないのです(´ノω・`*)ナケル-

そこで、IoT ブロック MESH LEDを使って
Slackの障害報告専用チャンネルを監視して光で知らせることができれば
晩ご飯つくってるときとかTVみているときでもすぐに反応ができるのではと考えました。

ちなみに社畜ではありませんが
エンジニアとして最低限の責任を果たしたいだけです( ・`ω・´)キリッ

MESHとは

以下リンクを確認ください

今回利用するMESH LEDはこちら

事前準備

  • MESH LEDを購入
  • Googleスプレッドシートを作成してGoogle Apps ScriptをWebアプリ化する
  • Slack APIを利用するたにBOTを作成
  • MESH アプリをダウンロード
  • MESH SDK利用のためのアカウントを登録
    MESH SDKとは、ざっくりオリジナルのレシピを作成するもの
    参考:https://meshprj.com/sdk-jp/

Let's try!

光らせるまでの整理

  1. 一定間隔で監視を走らせる
  2. :triangular_flag_on_post:Slackの障害報告専用チャンネルのメッセージを取得して最終投稿日を取得
  3. Googleスプレッドシート
    1. :triangular_flag_on_post:で取得した最終投稿日をPOST
    2. シートA1の登録済みの最終投稿日を取得
    3. シートA1の値を:triangular_flag_on_post:で取得した最終投稿日で更新
    4. 登録済みの最終投稿日POSTされた最終投稿日を比較
    5. 比較した結果をレスポンスに含めて返す
  4. レスポンスの結果をみてMESH LEDを光らせるOR処理を止める

1. MESH LEDを購入

公式サイトにリンクがあるので買いましょう。

2. Googleスプレッドシートを作成してGoogle Apps ScriptをWebアプリ化する

  1. Googleスプレッドシートを作成
    スクリーンショット 2021-04-28 15.31.51.png

  2. ツールのスクリプトエディタをクリックして開く

  3. コード.gs

    function doPost(e) {
      const sheet = SpreadsheetApp.getActive().getSheetByName('alert');
      const range = sheet.getRange('A2');
      const value = range.getValue();
      const params = e.parameter;
      let result = {
        'isAlert': false
      };
    
      if (!'latest_timestamp' in params) {
        return postResult(result);
      }
    
      if (value !== params['latest_timestamp']) {
        range.setValue(params['latest_timestamp']);
        result.isAlert = true;
        return postResult(result);
      }
    
      return postResult(result);
    }
    
    function postResult (obj) {
      return ContentService.createTextOutput(JSON.stringify(obj)).setMimeType(ContentService.MimeType.JSON);
    }
    
  4. デプロイしてWebアプリ化
    スクリーンショット 2021-04-28 14.06.07.png

  5. デプロイ完了後にウェブアプリのURLが発行されるのでメモ

3. Slack APIを利用するたにBOTを作成

手順はググればたくさんでてくるので省略します。
必要なのはAPI利用のためのTokenと適切な権限を設定してください。

今回利用するAPI

4. MESH SDKを利用してオリジナルレシピを作成

MESH SDK利用のためのアカウントを登録済みであることが前提

MESH SDKのドキュメント
https://meshprj.com/sdk/doc/ja/

Slack レシピ

特定チャンネルのメッセージを取得して最新投稿データのタイムスタンプを取得する
Connectorのラベル名はなくてもよい
スクリーンショット 2021-04-28 14.18.51.png

Code詳細

callbackSuccessが呼ばれたら
それ以降に記述された処理がどうなるかまでは調べ切れていないのであしからず。

Initialize
return {
    resultType : 'pause'
}
Receive
記述なし
Execute
var url = "https://slack.com/api/conversations.history";
var token = '****';
var data = {
    'channel' : '****',
    'limit' : 10
};

ajax ({
    url : url,
    data : data,
    type : 'get',
    contentType : 'application/x-www-form-urlencoded',
    dataType : 'json',
    timeout : 10000,
    beforeSend: function( xhr ) {
        xhr.setRequestHeader('Authorization', 'Bearer ' + token );
    },
    success : function ( contents ) {
        log('Slack Response : ' + contents);
        if (contents.ok) {
            for (k in contents.messages) {
                var v = contents.messages[k];
                log('text : ' + v.text);
                if ('blocks' in v) {
                    callbackSuccess( {
                        resultType : 'continue',
                        messageValues : {
                            latestTimestamp : v.ts
                        }
                    } );
                    break;
                }
            }
        } else {
            callbackSuccess( {
                resultType : 'stop'
            } );
        }
    },
    error : function ( request, errorMessage ) {
        log('Slack Error : ' + errorMessage);
        callbackSuccess( {
            resultType : 'stop'
        } );
    }
});

return {
    resultType : 'pause'
};
Result
return {
    resultType : 'continue'
};

Google Sheets レシピ

Slackレシピで取得したタイムスタンプをGoogle SheetsにPOSTする
Connectorのラベル名はなくてもよい
スクリーンショット 2021-04-28 14.28.11.png

Code詳細

callbackSuccessが呼ばれたら
それ以降に記述された処理がどうなるかまでは調べ切れていないのであしからず。

Initialize
return {
    resultType : 'pause'
}
Receive
記述なし
Execute
var url = "https://script.google.com/macros/s/****/exec";
var data = {
    'latest_timestamp' :  messageValues.latestTimestamp
};

log(messageValues.latestTimestamp);

ajax ({
    url : url,
    data : data,
    type : 'post',
    contentType : 'application/x-www-form-urlencoded',
    dataType : 'json',
    timeout : 10000,
    success : function ( contents ) {
        log('Google Response : ' + contents);
        if (contents.isAlert) {
            log('Alert occurs');
            callbackSuccess( {
                resultType : 'continue'
            } );
        } else {
            log('Peace');
            callbackSuccess( {
                resultType : 'stop'
            } );
        }
    },
    error : function ( request, errorMessage ) {
        log('Google Error : ' + errorMessage);
        callbackSuccess( {
            resultType : 'stop'
        } );
    }
});

return {
    resultType : 'pause'
};
Result
return {
    resultType : 'continue'
};

5. MESH アプリで組み立てる

MESH SDKで作成したレシピの追加方法は下記URLの2. 追加で説明があります。
https://meshprj.com/sdk/doc/ja/

完成図
C6500534-12BB-473C-818F-FC6412D09B67.JPEG

各タグの詳細

① 既存レシピのタイマーを設置して一定の間隔でを設定

A2D2A8FD-57BE-4F81-BC8A-62E5D0DADEA0.JPEG

② MESH SDKで作成したレシピの Slack関数を設定

32F12E59-FC3A-41E5-836D-D5C160413874.JPEG

③ MESH SDKで作成したレシピの Google Sheets関数を設定

6F62DCD0-92CF-4270-935E-7C7E4F4C0CD1.JPEG

④ ご自由に

00E0060F-7639-412C-A3DD-C584CDEC4C72.JPEG

6. 以上で完成

光らせてみた感想

単純に楽しい:bangbang:
可能性は無限大:bangbang:

ただ、おそらくですが
光らせるまでの処理はiPhoneに入れたMESHアプリが担当するので
バッテリーの減りとかが気になる:sweat_smile:

今回は機種変して不要となったiPhoneを利用したのでよいけど
iPhoneの役割をRaspberry Piに置き換えることも可能とのこと:sunglasses:

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1