この記事でわかること
我が家ではSwitchBotの温湿度計や開閉センサーをいくつか使っています。ある日、「玄関のドアが開いたら手元のDiscordに通知が来たら便利だな」と思い立ち、SwitchBotのWebhook機能を使ってDiscordへ通知を飛ばす仕組みを作ってみました。
この記事では次のことがわかります。
- SwitchBot APIのWebhookの仕組みと登録方法
- Webhookを受け取る中継サーバーの実装例
- Discordへ通知を届けるまでの一連の流れ
家庭で使っているセンサーの状態を、普段見ているチャットに集約できると想像以上に快適です。それでは順に見ていきましょう。
全体の構成
まず全体像を押さえておきます。SwitchBotのクラウドはイベントが発生すると、事前に登録したURLへHTTP POSTを送ってくれます。これを自前のサーバーで受け取り、内容を整形してDiscordのWebhookへ転送するという流れです。
ポイントは、SwitchBotから直接Discordへは送れないため、間に中継サーバーが必要になることです。この中継サーバーは常時起動している必要があるので、私はCloudflare WorkersやVPSのような常駐環境を使うのがおすすめです。
SwitchBot側の準備
トークンとシークレットの取得
SwitchBotのWebhookを利用するには、まずSwitchBotアプリからAPIのトークンとシークレットを取得します。アプリの「プロフィール」→「設定」→アプリのバージョンを数回タップすると開発者向けオプションが表示され、そこからトークンを確認できます。
Webhookの登録
Webhookの登録はAPI経由で行います。以下はcurlでの登録例です。認証ヘッダーの署名生成が必要ですが、ここではエンドポイント登録のイメージを示します。
curl -X POST https://api.switch-bot.com/v1.1/webhook/setupWebhook \
-H "Authorization: $TOKEN" \
-H "sign: $SIGN" \
-H "t: $TIMESTAMP" \
-H "nonce: $NONCE" \
-H "Content-Type: application/json" \
-d '{
"action": "setupWebhook",
"url": "https://example.com/switchbot",
"deviceList": "ALL"
}'
urlに自分の中継サーバーのエンドポイントを指定します。登録が成功すると、対象デバイスのイベント(開閉、動体検知、温湿度の変化など)がこのURLへ届くようになります。
Discord側の準備
Discord側は難しくありません。通知を送りたいチャンネルの設定から「連携サービス」→「ウェブフック」を開き、新しいWebhookを作成してURLをコピーするだけです。このURLに対してJSONをPOSTすればメッセージが投稿されます。
curl -X POST "$DISCORD_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d '{"content": "テスト通知です"}'
これで手動投稿ができることを確認しておくと、後の切り分けが楽になります。
中継サーバーの実装
中継サーバーはNode.jsのExpressで簡単に書けます。SwitchBotからのPOSTを受け取り、内容を見て文言を整えてからDiscordへ転送します。
import express from "express";
const app = express();
app.use(express.json());
const DISCORD_WEBHOOK_URL = process.env.DISCORD_WEBHOOK_URL;
app.post("/switchbot", async (req, res) => {
const { context } = req.body;
// 開閉センサーの例
let message = "SwitchBotイベントを受信しました";
if (context?.detectionState === "DETECTED") {
message = "🚪 ドアが開きました";
} else if (context?.openState === "open") {
message = "🚪 センサーが開状態になりました";
}
await fetch(DISCORD_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ content: message }),
});
// SwitchBotへは素早く200を返す
res.sendStatus(200);
});
app.listen(3000);
実装で気をつけたのは次の点です。
- SwitchBotへのレスポンスはできるだけ早く返す(重い処理は非同期に逃がす)
contextの中身はデバイス種別で異なるため、実際に届いたJSONをログで確認しながら分岐を作る- Discordのメッセージには時刻やデバイス名を含めると実用性が上がる
実際に届くペイロードはデバイスによって項目が違うので、最初は受け取った内容をそのままログ出力し、フィールド名を確かめてから整形するのが確実です。
動作確認とハマりどころ
登録後、実際にドアを開け閉めしてDiscordに通知が飛ぶか確認します。うまくいかない場合は、次の順番で切り分けると原因を特定しやすいです。
| 確認項目 | チェック内容 |
|---|---|
| Discord単体 | curlで手動投稿できるか |
| 中継サーバー | ログにSwitchBotからのPOSTが来ているか |
| Webhook登録 | queryWebhookで登録URLを確認 |
| 公開URL | 外部からアクセス可能なHTTPSか |
私の場合はローカルで試したときにHTTPSでないためイベントが届かず、少しハマりました。SwitchBotはHTTPSのエンドポイントを想定しているので、公開環境ではSSL対応を忘れないようにしましょう。
まとめ
SwitchBotのWebhookとDiscordを連携させることで、家のセンサーイベントを普段使いのチャットに集約できました。ポイントを振り返ります。
- SwitchBotからDiscordへは直接送れないため中継サーバーが必要
- Webhook登録はAPI経由、Discordはウェブフック作成だけで手軽
- 実際のペイロードをログで確認しながら文言を整えるのが近道
仕組み自体はシンプルですが、家族が帰宅したタイミングがわかったり、窓の閉め忘れに気づけたりと、暮らしの安心感が確実に上がりました。IoTと日常のツールをつなぐ工作は、費用も手間も小さいわりに満足度が高いので、ぜひ試してみてください。