0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SlackのIncoming WebHooksを使って鍵の管理をするBotを作った

Last updated at Posted at 2024-09-01

背景

鍵が開いているかどうかSlack上で把握できれば便利だと思ったので、作ってみた。

このシステムを作るにあたってこの方の記事を参考にさせていただきました。

環境

使用したマイコンはM5のAtom Lite
開発環境はArduino IDE

作り方

Web版のSlackでbotを追加したいワークスペースにログインして、ここのページの検索欄に"incoming webhook"と入力、一番上に出てくるアイコンをクリックする。

Slackに追加をクリック

botを追加したいチャンネルを選択して「Incoming Webhookインテグレーションを追加」をクリックする。
バグなのか、チャンネルを選択するプルダウンメニューがうまく出てこないことがある。そういうときはブラウザの別のタブを開くと直る。


Webhook URLが表示されるページに遷移されるので、これをメモする。
このURLが第三者に漏れると勝手にメッセージを送信される恐れがあるので注意する。

ソースコードの7行目にメモしたURLを書いておく。

HTTPのボディにJson形式の文字列を指定して送信するとbotがテキストを送信してくれる。
細かい仕様に関しては参考にさせていただいた記事に詳しく書いてある。

・大学のWi-Fiは長時間接続し続けられない仕様?があるのでボタンを押してからWi-Fiに接続するようにしてある。

ソースコード

sorcecode.ino
#include "M5Atom.h"
#include <HTTPClient.h>
#include <WiFi.h>

#define SSID "yourssid"
#define PASS "yourpw"
#define END_POINT "https://hooks.slack.com/services/example"//さっきメモしたURLをここに入力する

#define BUTTON_B 22
#define BUTTON_W 21

void rgbLED(uint8_t r, uint8_t g, uint8_t b);
void wifi_connect();
void post2server(String icon, String text);

void setup() {
  M5.begin(true, false, true);
  pinMode(BUTTON_B, INPUT);
  pinMode(BUTTON_W, INPUT);
  Serial.begin(115200);
}

void loop() {
  rgbLED(0, 0, 0);
  while(!digitalRead(BUTTON_B)){
    if(digitalRead(BUTTON_B)){
      wifi_connect();
      post2server("closed_lock_with_key", "鍵を閉めました:x:");
      delay(5000);
    }
  }
  while(!digitalRead(BUTTON_W)){
    if(digitalRead(BUTTON_W)){
      wifi_connect();
      post2server("unlock", "鍵を開けました:o:");
      delay(5000);
    }
  }
}

void rgbLED(uint8_t r, uint8_t g, uint8_t b){
  int rgb;
  rgb = (r << 16) + (g << 8) + b;
  M5.dis.drawpix(0, rgb);
}

void wifi_connect(){
  int icount = 0;
  rgbLED(255, 255, 0);

  WiFi.begin(SSID, PASS);

  while (WiFi.status() != WL_CONNECTED) {

    if(icount%2)rgbLED(0, 0, 0);
    else rgbLED(255, 255, 0);

    icount++;
    delay(500);
    if ( icount > 20 ) {                     
      ESP.restart();
      break;
    }
    
  }
  rgbLED(0, 0, 0);
}

void post2server(String icon, String text){
  HTTPClient http;

  if ((WiFi.status() == WL_CONNECTED)) {

    http.begin(END_POINT);

    // start connection and send HTTP header and body
    http.addHeader("Content-Type", "application/json;charset=utf-8");
    String send_data = String("{\"icon_emoji\": \":" + icon + ":\",\"text\": \"" + text + "\"}");
    int httpCode = http.POST(send_data);

    if (httpCode > 0) {
      if(httpCode >= 400) {
        rgbLED(255, 0, 0);
        Serial.print("通信エラー:post2server,httpCode ->");
        Serial.println(httpCode);
      }
      if (httpCode == HTTP_CODE_OK) {
        const String& payload = http.getString();
        if(payload == "ok"){
          rgbLED(0, 255, 0);
          Serial.println("送信成功");
        }else{
          rgbLED(255, 0, 0);
          Serial.println("送信失敗");
        }
      }
    }else {
        rgbLED(255, 0, 0);
        Serial.print("通信エラー:post2server,httpCode ->");
        Serial.println(httpCode);
    }

    http.end();
  }else{
    rgbLED(255, 0, 0);
    Serial.println("通信エラー:インターネットの接続がありません。");
  }
}

回路図


G22、G21はAtom LiteのGPIO22、21に接続することを表しています。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?