背景
鍵が開いているかどうか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("通信エラー:インターネットの接続がありません。");
}
}