こんにちは。永和システムマネジメントの内角低め担当、はたけやまたかし( @htkymtks )です。
Amazon Dash Button に触発されて「勤怠ボタン」をつくってみたのでご紹介します。(↓こんなのです)
勤怠ボタンとは?
私の所属する永和システムマネジメントでは在宅勤務が認められています。部署ごとに在宅勤務の運用ルールは異なりますが、私の所属するアジャイル事業部では在宅勤務時の作業開始と終了の連絡を社内チャットツール「Idobata」 *1 へ投稿するルールになっています。
勤怠ボタンの「🏠」と「🔚」を押すことで作業開始と終了を Idobata へ投稿することができます。
ハードウェア
勤怠ボタンはESPr DeveloperというWiFi接続可能な小さなマイコンを利用しています。ESPr Developerに載っているチップ「ESP8266」にはArduino開発環境が用意されているため、Arduino ライクな開発を行うことができます。
- ESPr Developer(ピンソケット実装済)× 1
- LED × 1 (適当なもので良い)
- 300Ω抵抗 × 1(LEDに使用)
- タクトスイッチ × 2
- USBケーブル(A-MicroBタイプ)
- ESPr Developerへのプログラムの書き込みに使用
- ブレッドボード
- ジャンパワイヤ(適量)
回路図
回路はこんな感じ。至ってシンプル。
ブレッドボード上で配線するとこんな感じ。
事前準備
事前に「Arduino IDEのセットアップ」と「ESPr DeveloperのArduino化」を行う必要があります。以下のサイトを参考にESPr DeveloperのArduino化を行いました。
以下のコードで14ピンに接続したLEDがチカチカすればOKです。
void setup() {
pinMode(14, OUTPUT);
}
void loop() {
digitalWrite(14, HIGH);
delay(1000);
digitalWrite(14, LOW);
delay(1000);
}
ソフトウェア
以下が勤怠ボタンのソースコードです。
- 接続するWiFiのSSID
- 接続するWiFiのパスワード
- Idobataの認証トークン(取得方法は後述)
- 投稿先のルームID(取得方法は後述)
を設定して、Arduino IDEからESPr Developerへ書き込みます。
loopの中で12ピンと13ピンの値を監視し続け、13ピンにつながった「🏠」ボタンが押された場合は「:house:」が、12ピンにつながった「🔚」ボタンが押された場合は「:end:」が Idobata へと投稿されます。
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
// WiFi SSID & Password
const char* ssid = "<Your WiFi SSID>";
const char* password = "<Your WiFi Password>";
// サーバ証明書のフィンガープリント
String fingerprint = "DC 0B 75 2D 66 75 42 65 AC 6D 68 C5 53 59 A4 25 E9 12 87 C2";
// 認証トークン
// curl -X POST -H "Content-type: application/json" -d '{"grant_type":"password", "username":"<Your email>", "password":"<Your password>" }' https://idobata.io/oauth/token | cut -b17-82
String authToken = "<Your auth token>";
// 投稿先ルームID
String roomID = "<Your kintai room ID>";
void setup() {
pinMode (12, INPUT_PULLUP);
pinMode (13, INPUT_PULLUP);
pinMode (14, OUTPUT);
Serial.begin(115200);
// Connect to WiFi
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
piko(1);
}
void loop() {
if (digitalRead(12) == LOW) {
post(":end:");
piko(3);
}
if (digitalRead(13) == LOW) {
post(":house:");
piko(2);
}
}
// 指定した回数ピコっと光る
void piko(int n) {
for (int i = 0; i < n; i++) {
digitalWrite(14, HIGH);
delay(100);
digitalWrite(14, LOW);
delay(100);
}
}
void post(String message) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin("https://idobata.io/api/messages", fingerprint);
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", "Bearer " + authToken);
int code = http.POST("{\"message\":{\"source\":\"" + message + "\",\"room_id\":\"" + roomID + "\"}}");
if (code > 0) {
Serial.printf("ok: %d\n", code);
} else {
Serial.printf("error: %d\n", code);
}
}
}
https 通信を行うためにサーバ証明書のフィンガープリントが必要です。ブラウザで https://idobata.io を開いて証明書の詳細を表示、「指紋 - SHA1」の値を使ってください。
Idobataの認証トークン
Idobata へ投稿するためには、httpリクエストヘッダに認証トークンを付与する必要があります。ターミナル上で以下のコマンドを叩くと Idobata の認証トークンを取得できます。ソースコード中の authToken 変数へ取得した値をセットしてください。
$ curl -X POST -H "Content-type: application/json" -d '{"grant_type":"password", "username":"<Your email>", "password":"<Your password>" }' https://idobata.io/oauth/token | cut -b17-82
投稿するルームの ID
投稿するルームの ID は Idobata の「ROOM SETTINGS」から確認できます。ソースコード中の roomID 変数へ取得した値をセットしてください。
ユニバーサル基板へ移植
ブレッドボード上で作成した回路をユニバーサル基板へ移植しました。
これが
こうなりました。小さくてカッコイイですね。ちっちゃいは正義だ。
最後に
以上、勤怠ボタンのつくりかたでした。
本当はAmazonDashButtonのガワだけでも使えないかなあと考えていたのですが、Dashのガワの再利用は思っていたよりも難しかったため基盤ムキ出しになっちゃいました。無念...。
また、今回はじめてESPr Developerを使ってみたのですが、小さくて安くてパワフルでお手軽な素晴らしいマイコンでした。ESPr Developer最高かよ。これからもESPr Developerを使ってIdobataと連携するボタンをいろいろと作りたいなあと考えております。はたけやま先生の次回作にご期待下さい!