課題
リモートワーク推奨とは言え、物理的なモノのやり取りがまったく無くなる訳ではなく、書類・雑誌・荷物などが職場の自席に届いたり。そして、それをたまたまFaceToFaceの打合せをする為に職場に行ったときに見つけたり。
なんだかんだ言って、まだまだアナログなやり取りって必要な場合があると思っています。急に全部をデジタル化って言っても、相手があってのものなので、強制的に「全部メールで知らせてくれ!」とはなかなかいかなくて。
作ったもの
荷物を置いたときに押してもらうボタンを設置して、自分に通知が来るシステム
システム構成
通知結果
Microsoft Teamsにこんな感じで通知が届きます。
Atom Lite側
- ボタンが押されたらHTTPリクエストを発行
- WiFi接続は各自の環境を使用する
- HTTPリクエストのURLは、Azure側の設定を使う
#include "M5Atom.h"
#include <WiFi.h>
#include <HTTPClient.h>
#define JST 3600 * 9
#define COLOR_BLANK 0x000000 // black/blank
#define COLOR_WHITE 0xffffff // white
#define COLOR_RED 0xff0000 // red
#define COLOR_GREEN 0x00ff00 // green
#define COLOR_BLUE 0x0000ff // blue
#define COLOR_PURPLE 0xff00ff // purple
#define COLOR_EMERALDGREEN 0x00ff80 // emerald green
// ★★★★★設定項目★★★★★★★★★★
const char *ssid = "xxxxxxxx";
const char *password = "xxxxxxxx";
// ★★★★★★★★★★★★★★★★★★★
uint8_t DisBuff[2 + 5 * 5 * 3];
void setDisp(uint32_t color)
{
DisBuff[0] = 0x05;
DisBuff[1] = 0x05;
for (int i = 0; i < 25; i++)
{
// modified color: M5Atom libraryのバグ?(RとGが逆)
// DisBuff[2 + i * 3 + 1] = color >> 16;
// DisBuff[2 + i * 3 + 0] = color >> 8;
DisBuff[2 + i * 3 + 0] = color >> 16;
DisBuff[2 + i * 3 + 1] = color >> 8;
DisBuff[2 + i * 3 + 2] = color;
}
M5.dis.displaybuff(DisBuff);
}
void wifiConnect()
{
Serial.print("Connecting to " + String(ssid));
//WiFi接続開始
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
//接続を試みる(15秒)
for (int i = 0; i < 30; i++)
{
if (WiFi.status() == WL_CONNECTED)
{
//接続に成功。IPアドレスを表示
Serial.println();
Serial.print("Connected! IP address: ");
Serial.println(WiFi.localIP());
break;
}
else
{
Serial.print(".");
delay(500);
}
}
// WiFiに接続出来ていない場合
if (WiFi.status() != WL_CONNECTED)
{
Serial.println("");
Serial.println("Failed, Wifi connecting error");
}
}
void wifiDisconnect()
{
Serial.println("Disconnecting WiFi...");
WiFi.disconnect(true); // disconnect & WiFi power off
}
// Teamsへの通知
int httpTrigger(void)
{
int res = 0;
HTTPClient http;
String url = "https://xxxxxxxxxx";
//Serial.println("connect url: " + url);
Serial.print("[HTTP] begin...\n");
if (http.begin(url))
{
Serial.print("[HTTP] GET...\n");
// start connection and send HTTP header
int httpCode = http.GET();
// httpCode will be negative on error
if (httpCode > 0)
{
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
//Serial.println(http.getSize());
// file found at server
String payload;
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_ACCEPTED || httpCode == HTTP_CODE_MOVED_PERMANENTLY)
{
payload = http.getString();
Serial.println("HTTP_CODE_OK");
Serial.println(payload);
}
}
else
{
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
// コネクションエラーが発生しているので、一旦WiFiを切断
wifiDisconnect();
res = HTTPC_ERROR_CONNECTION_REFUSED;
}
http.end();
}
else
{
Serial.printf("[HTTP] Unable to connect\n");
res = HTTPC_ERROR_NOT_CONNECTED;
}
return res;
}
void setup()
{
M5.begin(true, false, true);
delay(10);
setDisp(COLOR_WHITE);
// WiFi接続
wifiConnect();
setDisp(COLOR_BLANK);
// NTP同期
configTime(JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
}
void loop()
{
// STAモードで接続出来ていない場合
if (WiFi.status() != WL_CONNECTED)
{
wifiConnect();
}
if (M5.Btn.wasPressed())
{
setDisp(COLOR_GREEN);
httpTrigger();
setDisp(COLOR_BLANK);
}
delay(50);
M5.update();
}
Azure Logic Appsの設定
Teams側の設定
注意事項
Azure Logic Appsの場合は、Teamsへの[メッセージ送信]の機能もありますが、自分のアカウントでサインインした場合はTeamsでの通知が機能しなかったので、今回はTeamsの[Incoming Webhook]を使用しています。自分自身の投稿として認識されるからかなと思いながら、尚且つ、メンションの付け方も不明だったので、[Incoming Webhook]を使用しています。
まとめ
ハードウェアが絡むと開発が少し面倒でお金も掛かる気がしますが、Atom Liteを上手く使えば安価にいろいろ作れると思います。監視カメラで自席チェックなどもやってますが、定期的に自分で見に行ったりする必要がないので、全然こっちのほうが便利です。